6 (defvar repl-env
(mal-env))
7 (mal-env-set repl-env
'+ (lambda (a b
) (mal-number (+ (mal-value a
) (mal-value b
)))))
8 (mal-env-set repl-env
'-
(lambda (a b
) (mal-number (- (mal-value a
) (mal-value b
)))))
9 (mal-env-set repl-env
'* (lambda (a b
) (mal-number (* (mal-value a
) (mal-value b
)))))
10 (mal-env-set repl-env
'/ (lambda (a b
) (mal-number (/ (mal-value a
) (mal-value b
)))))
16 (if (and (mal-list-p ast
) (mal-value ast
))
17 (let* ((a (mal-value ast
))
25 (let ((identifier a1
*)
26 (value (EVAL a2 env
)))
27 (mal-env-set env identifier value
)))
29 (let ((env* (mal-env env
))
30 (bindings (if (vectorp a1
*) (append a1
* nil
) a1
*))
33 (let ((key (mal-value (pop bindings
)))
34 (value (EVAL (pop bindings
) env
*)))
35 (mal-env-set env
* key value
)))
39 (let* ((ast* (mal-value (eval-ast ast env
)))
45 (defun eval-ast (ast env
)
46 (let ((type (mal-type ast
))
47 (value (mal-value ast
)))
50 (let ((definition (mal-env-get env value
)))
51 (or definition
(error "Definition not found"))))
53 (mal-list (mapcar (lambda (item) (EVAL item env
)) value
)))
55 (mal-vector (vconcat (mapcar (lambda (item) (EVAL item env
)) value
))))
57 (let ((map (copy-hash-table value
)))
58 (maphash (lambda (key value
)
59 (puthash key
(EVAL value env
) map
))
70 (PRINT (EVAL (READ input
) repl-env
)))
72 (defun readln (prompt)
73 ;; C-d throws an error
74 (ignore-errors (read-from-minibuffer prompt
)))
76 (defun println (format-string &rest args
)
79 (princ (apply 'format format-string args
)))
85 (let ((input (readln "user> ")))
90 ;; empty input, carry on
92 (unterminated-sequence
93 (let* ((type (cadr err
))
96 ((eq type
'string
) ?
\")
98 ((eq type
'vector
) ?\
])
99 ((eq type
'map
) ?
}))))
100 (princ (format "Expected '%c', got EOF\n" end
))))
102 (println (error-message-string err
))))
104 ;; print final newline