perl: Remove step 0.5.
[jackhill/mal.git] / ocaml / step4_if_fn_do.ml
index a16649a..0e0cbaf 100644 (file)
@@ -6,9 +6,11 @@ let rec eval_ast ast env =
   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
@@ -19,6 +21,7 @@ let rec eval_ast ast env =
     | _ -> 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
@@ -41,7 +44,7 @@ and eval ast env =
         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 =
@@ -56,7 +59,7 @@ and eval ast env =
               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