added practicum files, updated gitignore
[fp1415.git] / files / practicum / RefactorXX.dcl
1 definition module RefactorXX
2
3 :: Expr = NR Int
4 | VAR Name
5 | OP Expr Operator Expr
6 | LET Name Expr Expr
7 :: Name :== String
8 :: Operator = PLUS | MIN | MUL | DIV
9 :: Val a = Result a | Undef
10
11 class fail c :: c a
12 class return c :: a -> c a
13 class (>>=) infix 0 c :: (c a) (a -> c b) -> c b
14 class Monad c | return, >>= c
15 class MonadFail c | Monad, fail c
16
17 instance fail [], Val
18 instance return [], Val
19 instance >>= [], Val
20
21 from StdClass import class toString
22
23 instance toString Expr
24 free :: Expr -> [Name]
25 remove_unused_lets :: Expr -> Expr
26 eval :: Expr -> c Int | MonadFail c