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) |> makeList
16 | Vector(_, seg
) -> seg
|> Seq.map
(eval
env) |> Array.ofSeq
|> Node.ofArray
17 | Map(_, map
) -> map
|> Map.map
(fun k v
-> eval
env v
) |> makeMap
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
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
50 | List(_, _) as node ->
51 let resolved = node |> eval_ast
env
53 | List(_, BuiltInFunc(_, _, f)::rest
) -> f rest
54 | _ -> raise
<| Error.errExpectedX
"func"
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
=
87 if args
|> Array.exists
(fun e
-> e
= "--raw") then
90 Readline.Mode.Terminal
94 let mode = getReadlineMode args
95 let env = Env.makeRootEnv
()
97 match Readline.read
"user> " mode with