summaryrefslogtreecommitdiff
path: root/src/compiler/GF/Compile/Optimize.hs
diff options
context:
space:
mode:
authorhallgren <hallgren@chalmers.se>2013-05-30 16:01:12 +0000
committerhallgren <hallgren@chalmers.se>2013-05-30 16:01:12 +0000
commitb93f81705874b832f41eff3a392a2302ed9980bb (patch)
tree82c2c79585c47ca5aa2b4933a1e49eb6aabac149 /src/compiler/GF/Compile/Optimize.hs
parentbf5dfb2293e6cf3e6787742e9402052d8fed2a5d (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.hs22
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