module Var where { import VarType; import VarParser; {---------------------------------------------------------------------- インタプリタその1 * Util0 + * 変数宣言 Expr -> Expr * Expr | Expr + Expr | Const | ( Expr ) | Ident | let Ident = Expr in Expr ----------------------------------------------------------------------} {- -- Monadic Version interp :: Expr -> Env -> M Value; interp (Const c) e = unitM c; interp (Add m n) e = interp m e `bindM` \ (Num c) -> interp n e `bindM` \ (Num d) -> unitM (Num (c+d)); interp (Mult m n) e = interp m e `bindM` \ (Num c) -> interp n e `bindM` \ (Num d) -> unitM (Num (c*d)); interp (Var x) e = unitM (lookupEnv e x); interp (Let (x, m) n) e = interp m e `bindM` \ v -> interp n ((x,v):e); -} type Env = [(String, Value)]; -- lookup' :: Eq a => a -> [(a, b)] -> b; lookup' :: String -> [(String, a)] -> a; lookup' x ((n,v):rest) = if n==x then v else lookup' x rest; -- Non-Monadic Version interp :: Expr -> Env -> Value; interp (Const c) e = c; interp (Add m n) e = let { Num c = interp m e; Num d = interp n e } in Num (c+d); interp (Mult m n) e = let { Num c = interp m e; Num d = interp n e } in Num (c*d); interp (Var x) e = lookup' x e; interp (Let (x, m) n) e = let { v = interp m e } in interp n ((x,v):e); run :: String -> String; run str = showValue (interp (myParse str) []); main :: IO (); main = interact run; load :: String -> IO (); load path = readFile path >>= \ prog -> putStrLn (run prog); -- for example -- run "let x=2*2 in let y=x*x in y*y" }