summaryrefslogtreecommitdiff
path: root/src/compiler/GF/Compile/Compute
diff options
context:
space:
mode:
authorkr.angelov <kr.angelov@gmail.com>2011-11-29 12:12:51 +0000
committerkr.angelov <kr.angelov@gmail.com>2011-11-29 12:12:51 +0000
commitfffc5f2507e3adb2e3e6c780f94f5a68e7cb59f6 (patch)
treee91e1f9fe84b3fdab78cf227774aeef52fb77b3d /src/compiler/GF/Compile/Compute
parent1dd5af772974a2055b63148ebc542fe22c0021b1 (diff)
Sketch of the new type checker for the concrete syntax. Enabled only with -new-comp
Diffstat (limited to 'src/compiler/GF/Compile/Compute')
-rw-r--r--src/compiler/GF/Compile/Compute/ConcreteNew.hs36
1 files changed, 36 insertions, 0 deletions
diff --git a/src/compiler/GF/Compile/Compute/ConcreteNew.hs b/src/compiler/GF/Compile/Compute/ConcreteNew.hs
new file mode 100644
index 000000000..1172ece42
--- /dev/null
+++ b/src/compiler/GF/Compile/Compute/ConcreteNew.hs
@@ -0,0 +1,36 @@
+module GF.Compile.Compute.ConcreteNew ( Value(..), Env, eval, apply, value2term ) where
+
+import GF.Grammar hiding (Env, VGen, VApp)
+
+data Value
+ = VApp QIdent [Value]
+ | VGen Int [Value]
+ | VMeta MetaId Env [Value]
+ | VClosure Env Term
+ | VSort Ident
+ deriving Show
+
+type Env = [(Ident,Value)]
+
+eval :: Env -> Term -> Value
+eval env (Vr x) = case lookup x env of
+ Just v -> v
+ Nothing -> error ("Unknown variable "++showIdent x)
+eval env (Q x) = VApp x []
+eval env (Meta i) = VMeta i env []
+eval env t@(Prod _ _ _ _) = VClosure env t
+eval env t@(Abs _ _ _) = VClosure env t
+eval env (Sort s) = VSort s
+eval env t = error (show t)
+
+apply env t vs = undefined
+
+value2term :: [Ident] -> Value -> Term
+value2term xs (VApp f vs) = foldl App (Q f) (map (value2term xs) vs)
+value2term xs (VGen j vs) = foldl App (Vr (reverse xs !! j)) (map (value2term xs) vs)
+value2term xs (VMeta j env vs) = foldl App (Meta j) (map (value2term xs) vs)
+value2term xs (VClosure env (Prod bt x t1 t2)) = Prod bt x (value2term xs (eval env t1))
+ (value2term (x:xs) (eval ((x,VGen (length xs) []) : env) t2))
+value2term xs (VClosure env (Abs bt x t)) = Abs bt x (value2term (x:xs) (eval ((x,VGen (length xs) []) : env) t))
+value2term xs (VSort s) = Sort s
+value2term xs v = error (show v)