diff options
| author | hallgren <hallgren@chalmers.se> | 2013-05-30 16:01:12 +0000 |
|---|---|---|
| committer | hallgren <hallgren@chalmers.se> | 2013-05-30 16:01:12 +0000 |
| commit | b93f81705874b832f41eff3a392a2302ed9980bb (patch) | |
| tree | 82c2c79585c47ca5aa2b4933a1e49eb6aabac149 /src/compiler/GF/Compile/Optimize.hs | |
| parent | bf5dfb2293e6cf3e6787742e9402052d8fed2a5d (diff) | |
new-comp: delay eta expansion until just before partial evaluation
This seems to work for the most part, but a problem showed up in WordsCat.gf in
the phrasebook.
Diffstat (limited to 'src/compiler/GF/Compile/Optimize.hs')
| -rw-r--r-- | src/compiler/GF/Compile/Optimize.hs | 22 |
1 files changed, 13 insertions, 9 deletions
diff --git a/src/compiler/GF/Compile/Optimize.hs b/src/compiler/GF/Compile/Optimize.hs index 3641440d8..11d30d051 100644 --- a/src/compiler/GF/Compile/Optimize.hs +++ b/src/compiler/GF/Compile/Optimize.hs @@ -104,22 +104,26 @@ evalInfo opts sgr m c info = do -- | the main function for compiling linearizations partEval :: Options -> SourceGrammar -> (Context,Type) -> Term -> Err Term -partEval opts gr (context, val) trm = errIn (render (text "partial evaluation" <+> ppTerm Qualified 0 trm)) $ do +partEval opts = if flag optNewComp opts + then partEvalNew opts + else partEvalOld opts + +partEvalNew opts gr (context, val) trm = + errIn (render (text "partial evaluation" <+> ppTerm Qualified 0 trm)) $ + checkPredefError gr trm + +partEvalOld opts gr (context, val) trm = errIn (render (text "partial evaluation" <+> ppTerm Qualified 0 trm)) $ do let vars = map (\(bt,x,t) -> x) context args = map Vr vars subst = [(v, Vr v) | v <- vars] trm1 = mkApp trm args - trm2 <- if new then return trm1 else computeTerm gr subst trm1 - trm3 <- if new - then return trm2 - else if rightType trm2 - then computeTerm gr subst trm2 -- compute twice?? - else recordExpand val trm2 >>= computeTerm gr subst + trm2 <- computeTerm gr subst trm1 + trm3 <- if rightType trm2 + then computeTerm gr subst trm2 -- compute twice?? + else recordExpand val trm2 >>= computeTerm gr subst trm4 <- checkPredefError gr trm3 return $ mkAbs [(Explicit,v) | v <- vars] trm4 where - new = flag optNewComp opts -- computations moved to GF.Compile.GeneratePMCFG - -- don't eta expand records of right length (correct by type checking) rightType (R rs) = case val of RecType ts -> length rs == length ts |
