Mercurial > urweb
comparison src/mono_reduce.sml @ 1804:62c18ecbfec4
Tweaking treatment of function application: substitute or introduce a 'let'?
author | Adam Chlipala <adam@chlipala.net> |
---|---|
date | Sun, 05 Aug 2012 14:55:28 -0400 |
parents | 0577be31a435 |
children | d12192c7aa3e |
comparison
equal
deleted
inserted
replaced
1803:d2383ffc18ab | 1804:62c18ecbfec4 |
---|---|
177 e | 177 e |
178 | _ => e, | 178 | _ => e, |
179 bind = fn ((lower, len), U.Exp.RelE _) => (lower+1, len) | 179 bind = fn ((lower, len), U.Exp.RelE _) => (lower+1, len) |
180 | (st, _) => st} | 180 | (st, _) => st} |
181 | 181 |
182 datatype result = Yes of exp list | No | Maybe | 182 datatype result = Yes of (string * typ * exp) list | No | Maybe |
183 | 183 |
184 fun match (env, p : pat, e : exp) = | 184 fun match (env, p : pat, e : exp) = |
185 case (#1 p, #1 e) of | 185 case (#1 p, #1 e) of |
186 (PWild, _) => Yes env | 186 (PWild, _) => Yes env |
187 | (PVar (x, t), _) => Yes (e :: env) | 187 | (PVar (x, t), _) => Yes ((x, t, e) :: env) |
188 | 188 |
189 | (PPrim (Prim.String s), EStrcat ((EPrim (Prim.String s'), _), _)) => | 189 | (PPrim (Prim.String s), EStrcat ((EPrim (Prim.String s'), _), _)) => |
190 if String.isPrefix s' s then | 190 if String.isPrefix s' s then |
191 Maybe | 191 Maybe |
192 else | 192 else |
517 let | 517 let |
518 (*val () = Print.prefaces "exp" [("e", MonoPrint.p_exp env (e, ErrorMsg.dummySpan))]*) | 518 (*val () = Print.prefaces "exp" [("e", MonoPrint.p_exp env (e, ErrorMsg.dummySpan))]*) |
519 | 519 |
520 fun doLet (x, t, e', b) = | 520 fun doLet (x, t, e', b) = |
521 let | 521 let |
522 val notValue = U.Exp.exists {typ = fn _ => false, | |
523 exp = fn e => | |
524 case e of | |
525 EPrim _ => false | |
526 | ECon _ => false | |
527 | ENone _ => false | |
528 | ESome _ => false | |
529 | ERecord _ => false | |
530 | _ => true} | |
531 | |
532 | |
522 fun doSub () = | 533 fun doSub () = |
523 let | 534 let |
524 val r = subExpInExp (0, e') b | 535 val r = subExpInExp (0, e') b |
525 in | 536 in |
526 (*Print.prefaces "doSub" [("e'", MonoPrint.p_exp env e'), | 537 (*Print.prefaces "doSub" [("e'", MonoPrint.p_exp env e'), |
595 andalso not (freeInAbs b) then | 606 andalso not (freeInAbs b) then |
596 trySub () | 607 trySub () |
597 else | 608 else |
598 e | 609 e |
599 end | 610 end |
611 else if countFree 0 0 b > 1 andalso notValue e' then | |
612 e | |
600 else | 613 else |
601 trySub () | 614 trySub () |
602 end | 615 end |
603 | 616 |
604 val r = | 617 val r = |
657 No => search pes | 670 No => search pes |
658 | Maybe => push () | 671 | Maybe => push () |
659 | Yes subs => | 672 | Yes subs => |
660 let | 673 let |
661 val (body, remaining) = | 674 val (body, remaining) = |
662 foldl (fn (e, (body, remaining)) => | 675 foldl (fn ((x, t, e), (body, remaining)) => |
663 (subExpInExp (0, multiLift remaining e) body, remaining - 1)) | 676 (if countFree 0 0 body > 1 then |
677 (ELet (x, t, multiLift remaining e, body), #2 e') | |
678 else | |
679 subExpInExp (0, multiLift remaining e) body, remaining - 1)) | |
664 (body, length subs - 1) subs | 680 (body, length subs - 1) subs |
665 val r = reduceExp (E.patBinds env p) body | 681 val r = reduceExp (E.patBinds env p) body |
666 in | 682 in |
667 (*Print.preface ("subs", Print.p_list (MonoPrint.p_exp env) subs);*) | 683 (*Print.preface ("subs", Print.p_list (MonoPrint.p_exp env) subs);*) |
668 (*Print.prefaces "ECase" | 684 (*Print.prefaces "ECase" |