11 function EvalAst(ast, env)
13 let varname = a:ast.val
14 return a:env.get(varname)
18 call add(ret, EVAL(e, a:env))
24 call add(ret, EVAL(e, a:env))
29 for [k,v] in items(a:ast.val)
30 let keyobj = HashParseKey(k)
31 let newkey = EVAL(keyobj, a:env)
32 let newval = EVAL(v, a:env)
33 let keystring = HashMakeKey(newkey)
34 let ret[keystring] = newval
42 function EVAL(ast, env)
44 return EvalAst(a:ast, a:env)
50 let first_symbol = a:ast.val[0].val
51 if first_symbol == "def!"
54 return a:env.set(a1.val, EVAL(a2, a:env))
55 elseif first_symbol == "let*"
58 let let_env = NewEnv(a:env)
59 let let_binds = a1.val
61 while i < len(let_binds)
62 call let_env.set(let_binds[i].val, EVAL(let_binds[i+1], let_env))
65 return EVAL(a2, let_env)
68 let el = EvalAst(a:ast, a:env)
70 return Fn(el.val[1:-1])
76 return PrStr(a:exp, 1)
79 function REP(str, env)
80 return PRINT(EVAL(READ(a:str), a:env))
83 let repl_env = NewEnv("")
84 call repl_env.set("+", {a -> IntegerNew(a[0].val + a[1].val)})
85 call repl_env.set("-", {a -> IntegerNew(a[0].val - a[1].val)})
86 call repl_env.set("*", {a -> IntegerNew(a[0].val * a[1].val)})
87 call repl_env.set("/", {a -> IntegerNew(a[0].val / a[1].val)})
90 let [eof, line] = Readline("user> ")
98 call PrintLn(REP(line, repl_env))
100 call PrintLn("Error: " . v:exception)