4 (require "readline.rkt" "types.rkt" "reader.rkt" "printer.rkt"
12 (define (eval-ast ast env)
14 [(symbol? ast) (send env get ast)]
15 [(_sequential? ast) (_map (lambda (x) (EVAL x env)) ast)]
16 [(hash? ast) (make-hash
17 (dict-map ast (lambda (k v) (cons k (EVAL v env)))))]
20 (define (EVAL ast env)
24 (let ([a0 (_nth ast 0)])
27 (send env set (_nth ast 1) (EVAL (_nth ast 2) env))]
29 (let ([let-env (new Env% [outer env] [binds null] [exprs null])])
31 (send let-env set (_first b_e)
32 (EVAL (_nth b_e 1) let-env)))
33 (_partition 2 (_to_list (_nth ast 1))))
34 (EVAL (_nth ast 2) let-env))]
36 (eval-ast (drop (drop-right ast 1) 1) env)
37 (EVAL (last ast) env)]
39 (let ([cnd (EVAL (_nth ast 1) env)])
40 (if (or (eq? cnd nil) (eq? cnd #f))
41 (if (> (length ast) 3)
42 (EVAL (_nth ast 3) env)
44 (EVAL (_nth ast 2) env)))]
47 (lambda args (EVAL (_nth ast 2)
51 (_nth ast 2) env (_nth ast 1) #f nil)]
52 [else (let* ([el (eval-ast ast env)]
58 [outer (malfunc-env f)]
59 [binds (malfunc-params f)]
69 (new Env% [outer null] [binds null] [exprs null]))
71 (PRINT (EVAL (READ str) repl-env)))
73 (for () ;; ignore return values
75 ;; core.rkt: defined using Racket
76 (hash-for-each core_ns (lambda (k v) (send repl-env set k v)))
77 (send repl-env set 'eval (lambda [ast] (EVAL ast repl-env)))
78 (send repl-env set '*ARGV* (list))
80 ;; core.mal: defined using the language itself
81 (rep "(def! not (fn* (a) (if a false true)))")
82 (rep "(def! load-file (fn* (f) (eval (read-string (str \"(do \" (slurp f) \")\")))))")
87 (let ([line (readline "user> ")])
88 (when (not (eq? nil line))
90 ([string? (lambda (exc) (printf "Error: ~a~n" exc))]
91 [blank-exn? (lambda (exc) null)])
92 (printf "~a~n" (rep line)))
94 (let ([args (current-command-line-arguments)])
95 (if (> (vector-length args) 0)
96 (for () (rep (string-append "(load-file \"" (vector-ref args 0) "\")")))