match ast with
| T.Symbol s -> Env.get env ast
| T.List { T.value = xs; T.meta = meta }
- -> T.List { T.value = (List.map (fun x -> eval x env) xs); T.meta = meta }
+ -> T.List { T.value = (List.map (fun x -> eval x env) xs);
+ T.meta = meta }
| T.Vector { T.value = xs; T.meta = meta }
- -> T.Vector { T.value = (List.map (fun x -> eval x env) xs); T.meta = meta }
+ -> T.Vector { T.value = (List.map (fun x -> eval x env) xs);
+ T.meta = meta }
| T.Map { T.value = xs; T.meta = meta }
-> T.Map {T.meta = meta;
T.value = (Types.MalMap.fold
| _ -> ast
and eval ast env =
match ast with
+ | T.List { T.value = [] } -> ast
| T.List { T.value = [(T.Symbol { T.value = "def!" }); key; expr] } ->
let value = (eval expr env) in
Env.set env key value; value
if Types.to_bool (eval test env) then (eval then_expr env) else T.Nil
| T.List { T.value = [T.Symbol { T.value = "fn*" }; T.Vector { T.value = arg_names }; expr] }
| T.List { T.value = [T.Symbol { T.value = "fn*" }; T.List { T.value = arg_names }; expr] } ->
- T.Fn
+ Types.fn
(function args ->
let sub_env = Env.make (Some env) in
let rec bind_args a b =
eval expr sub_env)
| T.List _ ->
(match eval_ast ast env with
- | T.List { T.value = ((T.Fn f) :: args) } -> f args
+ | T.List { T.value = ((T.Fn { T.value = f }) :: args) } -> f args
| _ -> raise (Invalid_argument "Cannot invoke non-function"))
| _ -> eval_ast ast env