26 lines
761 B
Haskell
26 lines
761 B
Haskell
{-# Language LambdaCase #-}
|
|
module Assignment where
|
|
|
|
import Chi
|
|
|
|
subst :: Variable -> Exp -> Exp -> Exp
|
|
subst var e = \case
|
|
Apply e1 e2 -> Apply (subst var e e1) (subst var e e2)
|
|
Lambda x e' -> Lambda x $ if var /= x then (subst var e e') else e'
|
|
Var x -> if var == x then e else Var x
|
|
Const c es -> Const c $ map (subst var e) es
|
|
Rec x e' -> Rec x $ if var /= x then (subst var e e') else e'
|
|
Case e' branches -> Case (subst var e e') $ map substBr branches
|
|
where
|
|
substBr :: Br -> Br
|
|
substBr (Branch c vs e') = Branch c vs $ if var `notElem` vs then (subst var e e') else e'
|
|
|
|
eval' :: Exp -> Reader (Map Variable Exp) Exp
|
|
eval' = undefined
|
|
|
|
eval :: Exp -> Exp
|
|
eval = undefined
|
|
|
|
main :: IO ()
|
|
main = getLine >>= print . eval . parse
|