Travis: add remaining implementations.
[jackhill/mal.git] / fsharp / step3_env.fs
index 1eb5270..309a0a0 100644 (file)
@@ -8,17 +8,17 @@ module REPL
             f first second
             iterPairs f t
         | Empty -> ()
-        | _ -> raise <| Error.expectedX "list or vector"
+        | _ -> raise <| Error.errExpectedX "list or vector"
 
     let rec eval_ast env = function
         | Symbol(sym) -> Env.get env sym
-        | List(lst) -> lst |> List.map (eval env) |> List
-        | Vector(seg) -> seg |> Seq.map (eval env) |> Array.ofSeq |> Node.ofArray
-        | Map(map) -> map |> Map.map (fun k v -> eval env v) |> Map
+        | List(_, lst) -> lst |> List.map (eval env) |> makeList
+        | Vector(_, seg) -> seg |> Seq.map (eval env) |> Array.ofSeq |> Node.ofArray
+        | Map(_, map) -> map |> Map.map (fun k v -> eval env v) |> makeMap
         | node -> node
 
     and defBang env = function
-        | sym::node::[] ->
+        | [sym; node] ->
             match sym with
             | Symbol(sym) ->
                 let node = eval env node
@@ -35,23 +35,23 @@ module REPL
         Env.set env s form
 
     and letStar env = function
-        | bindings::form::[] ->
+        | [bindings; form] ->
             let newEnv = Env.makeNew env [] []
             let binder = setBinding newEnv
             match bindings with
-            | List(_) | Vector(_) -> iterPairs binder bindings
+            | List(_, _) | Vector(_, _) -> iterPairs binder bindings
             | _ -> raise <| Error.errExpectedX "list or vector"
             eval newEnv form
         | _ -> raise <| Error.wrongArity ()
 
     and eval env = function
-        | List(Symbol("def!")::rest) -> defBang env rest
-        | List(Symbol("let*")::rest) -> letStar env rest
-        | List(_) as node ->
+        | List(_, Symbol("def!")::rest) -> defBang env rest
+        | List(_, Symbol("let*")::rest) -> letStar env rest
+        | List(_, _) as node ->
             let resolved = node |> eval_ast env
             match resolved with
-            | List(Func(_, f, _, _, [])::rest) -> f rest
-            | _ -> raise <| Error.errExpectedX "function"
+            | List(_, BuiltInFunc(_, _, f)::rest) -> f rest
+            | _ -> raise <| Error.errExpectedX "func"
         | node -> node |> eval_ast env
 
     let READ input =
@@ -83,8 +83,8 @@ module REPL
         |> Seq.choose (fun form -> EVAL env form)
         |> Seq.iter (fun value -> PRINT value)
 
-    let getReadlineMode (args : string array) =
-        if args.Length > 0 && args.[0] = "--raw" then
+    let getReadlineMode args =
+        if args |> Array.exists (fun e -> e = "--raw") then
             Readline.Mode.Raw
         else
             Readline.Mode.Terminal