Common Lisp: Add documentation
[jackhill/mal.git] / fsharp / reader.fs
index ea2b4d6..de3c64a 100644 (file)
@@ -2,13 +2,11 @@ module Reader
     open System
     open Tokenizer
     open Types
+    open Node
 
     type MutableList = System.Collections.Generic.List<Node>
     let inline addToMutableList (lst:MutableList) item = lst.Add(item); lst
 
-    let errExpectedButEOF tok = ReaderError(sprintf "Expected %s, got EOF" tok)
-    let errInvalid () = ReaderError("Invalid token")
-
     let quote = Symbol("quote")
     let quasiquote = Symbol("quasiquote")
     let unquote = Symbol("unquote")
@@ -30,54 +28,54 @@ module Reader
 
     and wrapForm node tokens = 
         match readForm tokens with
-        | Some(form), rest -> Some(List([node; form])), rest
-        | None, _ -> raise <| errExpectedButEOF "form"
+        | Some(form), rest -> Some(makeList [node; form]), rest
+        | None, _ -> raise <| Error.expectedXButEOF "form"
 
     and readList acc = function
-        | CloseParen::rest -> Some(List(acc |> List.rev)), rest
-        | [] -> raise <| errExpectedButEOF "')'"
+        | CloseParen::rest -> Some(acc |> List.rev |> makeList), rest
+        | [] -> raise <| Error.expectedXButEOF "')'"
         | tokens -> 
             match readForm tokens with
             | Some(form), rest -> readList (form::acc) rest
-            | None, _ -> raise <| errExpectedButEOF "')'"
+            | None, _ -> raise <| Error.expectedXButEOF "')'"
 
     and readVector acc = function
-        | CloseBracket::rest -> Some(Vector(acc.ToArray())), rest
-        | [] -> raise <| errExpectedButEOF "']'"
+        | CloseBracket::rest -> Some(acc.ToArray() |> Node.ofArray), rest
+        | [] -> raise <| Error.expectedXButEOF "']'"
         | tokens -> 
             match readForm tokens with
             | Some(form), rest -> readVector (addToMutableList acc form) rest
-            | None, _ -> raise <| errExpectedButEOF "']'"
+            | None, _ -> raise <| Error.expectedXButEOF "']'"
 
     and readMap acc = function
-        | CloseBrace::rest -> Some(Map(acc |> List.rev |> Map.ofList)), rest
-        | [] -> raise <| errExpectedButEOF "'}'"
+        | CloseBrace::rest -> Some(acc |> List.rev |> Map.ofList |> makeMap), rest
+        | [] -> raise <| Error.expectedXButEOF "'}'"
         | tokens -> 
             match readForm tokens with
             | Some(key), rest ->
                 match readForm rest with
                 | Some(v), rest -> readMap ((key, v)::acc) rest
-                | None, _ -> raise <| errExpectedButEOF "'}'"
-            | None, _ -> raise <| errExpectedButEOF "'}'"
+                | None, _ -> raise <| Error.expectedXButEOF "'}'"
+            | None, _ -> raise <| Error.expectedXButEOF "'}'"
 
     and readMeta = function
         | OpenBrace::rest ->
             let meta, rest = readMap [] rest
             match readForm rest with
-            | Some(form), rest -> Some(List([withMeta; form; meta.Value])), rest
-            | None, _ -> raise <| errExpectedButEOF "form"
-        | _ -> raise <| errExpectedButEOF "map"
+            | Some(form), rest -> Some([withMeta; form; meta.Value] |> makeList), rest
+            | None, _ -> raise <| Error.expectedXButEOF "form"
+        | _ -> raise <| Error.expectedXButEOF "map"
 
     and readAtom = function
-        | Token("nil")::rest -> Some(Nil), rest
-        | Token("true")::rest -> Some(Bool(true)), rest
-        | Token("false")::rest -> Some(Bool(false)), rest
+        | Token("nil")::rest -> Node.SomeNIL, rest
+        | Token("true")::rest -> Node.SomeTRUE, rest
+        | Token("false")::rest -> Node.SomeFALSE, rest
         | Tokenizer.String(str)::rest -> Some(String(str)), rest
         | Tokenizer.Keyword(kw)::rest -> Some(Keyword(kw)), rest
         | Tokenizer.Number(num)::rest -> Some(Number(Int64.Parse(num))), rest
         | Token(sym)::rest -> Some(Symbol(sym)), rest
         | [] -> None, []
-        | _ -> raise <| errInvalid ()
+        | _ -> raise <| Error.invalidToken ()
         
     let rec readForms acc = function
         | [] -> List.rev acc