10 function EvalAst(ast, env)
12 let varname = a:ast.val
13 if !has_key(a:env, varname)
14 throw "'" . varname . "' not found"
18 return ListNew(map(copy(a:ast.val), {_, e -> EVAL(e, a:env)}))
20 return VectorNew(map(copy(a:ast.val), {_, e -> EVAL(e, a:env)}))
23 for [k,v] in items(a:ast.val)
24 let keyobj = HashParseKey(k)
25 let newkey = EVAL(keyobj, a:env)
26 let newval = EVAL(v, a:env)
27 let keystring = HashMakeKey(newkey)
28 let ret[keystring] = newval
36 function EVAL(ast, env)
38 return EvalAst(a:ast, a:env)
45 let el = EvalAst(a:ast, a:env)
48 return Fn(el.val[1:-1])
52 return PrStr(a:exp, 1)
55 function REP(str, env)
56 return PRINT(EVAL(READ(a:str), a:env))
60 let repl_env["+"] = {a -> IntegerNew(a[0].val + a[1].val)}
61 let repl_env["-"] = {a -> IntegerNew(a[0].val - a[1].val)}
62 let repl_env["*"] = {a -> IntegerNew(a[0].val * a[1].val)}
63 let repl_env["/"] = {a -> IntegerNew(a[0].val / a[1].val)}
66 let [eof, line] = Readline("user> ")
74 call PrintLn(REP(line, repl_env))
76 call PrintLn("ERROR: " . v:exception)