Common Lisp: Add documentation
[jackhill/mal.git] / fsharp / step5_tco.fs
index 73ea446..7c0a7d3 100644 (file)
@@ -12,9 +12,9 @@ module REPL
 
     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 defBangForm env = function
@@ -39,7 +39,7 @@ module REPL
             let inner = Env.makeNew outer [] []
             let binder = setBinding inner
             match bindings with
-            | List(_) | Vector(_)-> iterPairs binder bindings
+            | List(_, _) | Vector(_, _)-> iterPairs binder bindings
             | _ -> raise <| Error.errExpectedX "list or vector"
             inner, form
         | _ -> raise <| Error.wrongArity ()
@@ -69,27 +69,28 @@ module REPL
             Env.makeFunc f body binds outer
 
         match nodes with
-        | [List(binds); body] -> makeFunc binds body
-        | [Vector(seg); body] -> makeFunc (List.ofSeq seg) body
+        | [List(_, binds); body] -> makeFunc binds body
+        | [Vector(_, seg); body] -> makeFunc (List.ofSeq seg) body
         | [_; _] -> raise <| Error.errExpectedX "bindings of list or vector"
         | _ -> raise <| Error.wrongArity ()
 
     and eval env = function
-        | List(Symbol("def!")::rest) -> defBangForm env rest
-        | List(Symbol("let*")::rest) ->
+        | List(_, []) as emptyList -> emptyList
+        | List(_, Symbol("def!")::rest) -> defBangForm env rest
+        | List(_, Symbol("let*")::rest) ->
             let inner, form = letStarForm env rest
             form |> eval inner
-        | List(Symbol("if")::rest) -> ifForm env rest |> eval env
-        | List(Symbol("do")::rest) -> doForm env rest |> eval env
-        | List(Symbol("fn*")::rest) -> fnStarForm env rest
-        | List(_) as node ->
+        | List(_, Symbol("if")::rest) -> ifForm env rest |> eval env
+        | List(_, Symbol("do")::rest) -> doForm env rest |> eval env
+        | List(_, Symbol("fn*")::rest) -> fnStarForm env rest
+        | List(_, _) as node ->
             let resolved = node |> eval_ast env
             match resolved with
-            | List(Func(_, f, _, _, [])::rest) -> f rest
-            | List(Func(_, _, body, binds, outer)::rest) ->
+            | List(_, BuiltInFunc(_, _, f)::rest) -> f rest
+            | List(_, Func(_, _, _, body, binds, outer)::rest) ->
                 let inner = Env.makeNew outer binds rest
                 body |> eval inner
-            | _ -> raise <| Error.errExpectedX "function"
+            | _ -> raise <| Error.errExpectedX "func"
         | node -> node |> eval_ast env
 
     let READ input =