6 let rec iterPairs
f = function
7 | Pair(first
, second
, t
) ->
11 | _ -> raise
<| Error.errExpectedX
"list or vector"
13 let rec eval_ast
env = function
14 | Symbol(sym
) -> Env.get
env sym
15 | List(lst
) -> lst
|> List.map
(eval
env) |> List
16 | Vector(seg
) -> seg
|> Seq.map
(eval
env) |> Array.ofSeq
|> Node.ofArray
17 | Map(map
) -> map
|> Map.map
(fun k v
-> eval
env v
) |> Map
20 and defBang
env = function
24 let node = eval
env node
27 | _ -> raise
<| Error.errExpectedX
"symbol"
28 | _ -> raise
<| Error.wrongArity
()
30 and setBinding
env first
second =
31 let s = match first
with
33 | _ -> raise
<| Error.errExpectedX
"symbol"
34 let form = eval
env second
37 and letStar
env = function
38 | bindings::form::[] ->
39 let newEnv = Env.makeNew
env [] []
40 let binder = setBinding
newEnv
42 | List(_) | Vector(_) -> iterPairs
binder bindings
43 | _ -> raise
<| Error.errExpectedX
"list or vector"
45 | _ -> raise
<| Error.wrongArity
()
47 and eval
env = function
48 | List(Symbol("def!")::rest
) -> defBang
env rest
49 | List(Symbol("let*")::rest
) -> letStar
env rest
51 let resolved = node |> eval_ast
env
53 | List(Func(_, f, _, _, [])::rest
) -> f rest
54 | _ -> raise
<| Error.errExpectedX
"function"
55 | node -> node |> eval_ast
env
61 | Error.ReaderError(msg
) ->
69 | Error.EvalError(msg
)
70 | Error.ReaderError(msg
) ->
83 |> Seq.choose
(fun form -> EVAL env form)
84 |> Seq.iter
(fun value
-> PRINT value
)
86 let getReadlineMode (args
: string array
) =
87 if args
.Length > 0 && args
.[0] = "--raw" then
90 Readline.Mode.Terminal
94 let mode = getReadlineMode args
95 let env = Env.makeRootEnv
()
97 match Readline.read
"user> " mode with