0554397d741b3695e8348a74db42460194c154d3
5 type Env = System.Collections.Generic.Dictionary<string, Node>
6 type EnvChain = Env list
8 let errSymbolNotFound s
= EvalError(sprintf
"'%s' not found" s
)
9 let errNoEnvironment () = EvalError("no environment")
11 let makeEmpty () = Env()
14 let env = makeEmpty ()
15 let accumulate (e
: Env) (k
, v
) = e
.Add(k
, v
); e
16 List.fold
accumulate env lst
18 let set (env : EnvChain) key node
=
20 | head::_
-> head.[key
] <- node
21 | _ -> raise
<| errNoEnvironment ()
23 let rec find
(chain
: EnvChain) key
=
27 match env.TryGetValue(key
) with
29 | false, _ -> find rest
key
32 match find chain
key with
34 | None -> raise
<| errSymbolNotFound key
37 let wrap tag name
func = name
, Func({ Tag = tag
; Name = name
; F = func })
39 [ wrap 1 "+" Core.add
;
40 wrap 2 "-" Core.subtract
;
41 wrap 3 "*" Core.multiply
;
42 wrap 4 "/" Core.divide
]
46 let makeNew (env : EnvChain) = (makeEmpty ())::env