\r
// evaluator met tabel van naam-waarde paren:\r
eval :: Expr -> Val\r
-eval e = fst (eval` e [])\r
+eval e = eval` e []\r
where\r
- eval` :: Expr [(Name, Val)] -> (Val, [(Name, Val)])\r
- eval` (NR n) vs = (Result n, [])\r
- eval` (VAR s) vs = (find s vs, [])\r
+ eval` :: Expr [(Name, Val)] -> Val\r
+ eval` (NR n) vs = Result n\r
+ eval` (VAR s) vs = find s vs\r
where\r
find :: Name [(Name, Val)] -> Val\r
find _ [] = Undef\r
find s [(t,v):vs]\r
| s == t = v\r
| otherwise = find s vs\r
- eval` (LET s e1 e2) vs = eval` e2 [(s,fst (eval` e1 vs)):vs]\r
- eval` (OP e1 o e2) vs = (op o (fst (eval` e1 vs)) (fst (eval` e2 vs)), [])\r
+ eval` (LET s e1 e2) vs = eval` e2 [(s,eval` e1 vs):vs]\r
+ eval` (OP e1 o e2) vs = op o (eval` e1 vs) (eval` e2 vs)\r
where\r
op :: Operator Val Val -> Val\r
op _ Undef _ = Undef\r