1 (load-file "../mal/env.mal")
2 (load-file "../mal/core.mal")
5 (def! READ (fn* [strng]
10 (def! eval-ast (fn* [ast env] (do
11 ;;(do (prn "eval-ast" ast "/" (keys env)) )
13 (symbol? ast) (env-get env ast)
15 (list? ast) (map (fn* [exp] (EVAL exp env)) ast)
17 (vector? ast) (apply vector (map (fn* [exp] (EVAL exp env)) ast))
19 (map? ast) (apply hash-map
21 (map (fn* [k] [k (EVAL (get ast k) env)])
26 (def! LET (fn* [env args]
27 (if (> (count args) 0)
29 (env-set env (nth args 0) (EVAL (nth args 1) env))
30 (LET env (rest (rest args)))))))
32 (def! EVAL (fn* [ast env] (do
33 ;;(do (prn "EVAL" ast "/" (keys @env)) )
38 (let* [a0 (first ast)]
41 (env-set env (nth ast 1) (EVAL (nth ast 2) env))
44 (let* [let-env (new-env env)]
46 (LET let-env (nth ast 1))
47 (EVAL (nth ast 2) let-env)))
50 (let* [el (eval-ast (rest ast) env)]
51 (nth el (- (count el) 1)))
54 (let* [cond (EVAL (nth ast 1) env)]
55 (if (or (= cond nil) (= cond false))
57 (EVAL (nth ast 3) env)
59 (EVAL (nth ast 2) env)))
63 (EVAL (nth ast 2) (new-env env (nth ast 1) args)))
66 (let* [el (eval-ast ast env)
73 (def! PRINT (fn* [exp] (pr-str exp)))
76 (def! repl-env (new-env))
77 (def! rep (fn* [strng]
78 (PRINT (EVAL (READ strng) repl-env))))
80 ;; core.mal: defined directly using mal
81 (map (fn* [data] (env-set repl-env (nth data 0) (nth data 1))) core_ns)
82 (env-set repl-env 'eval (fn* [ast] (EVAL ast repl-env)))
83 (env-set repl-env '*ARGV* (rest *ARGV*))
85 ;; core.mal: defined using the new language itself
86 (rep "(def! not (fn* [a] (if a false true)))")
87 (rep "(def! load-file (fn* (f) (eval (read-string (str \"(do \" (slurp f) \")\")))))")
90 (def! repl-loop (fn* []
91 (let* [line (readline "mal-user> ")]
98 (println "Uncaught exception:" exc))))
101 (def! -main (fn* [& args]
102 (if (> (count args) 0)
103 (rep (str "(load-file \"" (first args) "\")"))