Commit d793bb9e authored by Taddeus Kroes's avatar Taddeus Kroes

funclang series5: Added freevars function for ass12.

parent e052f91d
......@@ -43,19 +43,35 @@ let rec expr2string =
| Cond (cond, e1, e2) -> "if " ^ expr2string(cond)
^ " then " ^ expr2string(e1)
^ " else " ^ expr2string(e2)
| Fun (arg, e) -> "fun " ^ arg ^ " -> " ^ expr2string(e)
| Fun (arg, e) -> "func " ^ arg ^ " -> " ^ expr2string(e)
| FunAp (e1, e2) -> "(" ^ expr2string(e1) ^ " " ^ expr2string(e2) ^ ")"
| Let (var, e1, e2) -> "let " ^ var ^ " = " ^ expr2string(e1)
^ " in " ^ expr2string(e2)
| LetRec (var, e1, e2) -> "let rec " ^ var ^ " = " ^ expr2string(e1)
^ " in " ^ expr2string(e2)
;;
(* let a = 1 in b *)
print_endline (expr2string (Let ("a", (Num 1), (Var "b"))));;
(* a + 3 *)
print_endline (expr2string (BinopAp (Add, Var "a", Num 3)));;
let freevars e =
let rec free_vars bound_vars = function
Num _ | Bool _ -> []
| Var v when List.mem v bound_vars -> []
| Var v -> [v]
| MonopAp (_, e) -> free_vars bound_vars e
| BinopAp (_, e1, e2)
| FunAp (e1, e2) -> free_vars bound_vars e1 @ free_vars bound_vars e2
| Cond (cond, e1, e2) -> free_vars bound_vars cond
@ free_vars bound_vars e1
@ free_vars bound_vars e2
| Fun (arg, e) -> free_vars (arg::bound_vars) e
| Let (v, e1, e2) -> free_vars (v::bound_vars) e2
@ free_vars bound_vars e1
| LetRec (v, e1, e2) -> let bound = v::bound_vars in
free_vars bound e2 @ free_vars bound e1
in
free_vars [] e
(* -a *)
print_endline (expr2string (MonopAp (Neg, Var "a")));;
(*let rec subs e var replacement =
let free = freevars e in
match e with
| Num _ | Bool _ -> e
| Var v when List.mem v bound_vars -> []
| Var v -> [v]*)
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment