1 ;; -*- lexical-binding: t; -*-
3 (setq debug-on-error t
)
11 (defvar repl-env
(mal-env))
13 (dolist (binding core-ns
)
14 (let ((symbol (car binding
))
16 (mal-env-set repl-env symbol fn
)))
24 (if (and (mal-list-p ast
) (mal-value ast
))
25 (let* ((a (mal-value ast
))
33 (let ((identifier (mal-value a1
))
34 (value (EVAL a2 env
)))
35 (throw 'return
(mal-env-set env identifier value
))))
37 (let* ((env* (mal-env env
))
38 (bindings (mal-value a1
))
40 (when (vectorp bindings
)
41 (setq bindings
(append bindings nil
)))
43 (let ((key (mal-value (pop bindings
)))
44 (value (EVAL (pop bindings
) env
*)))
45 (mal-env-set env
* key value
)))
49 (let* ((a0...
(cdr a
))
50 (butlast (butlast a0...
))
51 (last (car (last a0...
))))
53 (eval-ast (mal-list butlast
) env
))
54 (setq ast last
))) ; TCO
56 (let* ((condition (EVAL a1 env
))
57 (condition-type (mal-type condition
))
60 (if (and (not (eq condition-type
'false
))
61 (not (eq condition-type
'nil
)))
65 (throw 'return mal-nil
)))))
67 (let* ((binds (mapcar 'mal-value
(mal-value a1
)))
71 (let ((env* (mal-env env binds args
)))
73 (throw 'return
(mal-func body binds env fn
))))
76 (let* ((ast* (mal-value (eval-ast ast env
)))
80 (let ((env* (mal-env (mal-func-env fn
)
84 ast
(mal-func-ast fn
))) ; TCO
85 (let ((fn* (if (mal-fn-p fn
)
86 ;; unbox user-defined function
88 ;; use built-in function
90 (throw 'return
(apply fn
* args
))))))))
91 (throw 'return
(eval-ast ast env
))))))
93 (defun eval-ast (ast env
)
94 (let ((type (mal-type ast
))
95 (value (mal-value ast
)))
98 (let ((definition (mal-env-get env value
)))
99 (or definition
(error "Definition not found"))))
101 (mal-list (mapcar (lambda (item) (EVAL item env
)) value
)))
103 (mal-vector (vconcat (mapcar (lambda (item) (EVAL item env
)) value
))))
105 (let ((map (copy-hash-table value
)))
106 (maphash (lambda (key value
)
107 (puthash key
(EVAL value env
) map
))
118 (PRINT (EVAL (READ input
) repl-env
)))
120 (rep "(def! not (fn* (a) (if a false true)))")
122 (defun readln (prompt)
123 ;; C-d throws an error
124 (ignore-errors (read-from-minibuffer prompt
)))
126 (defun println (format-string &rest args
)
128 (princ format-string
)
129 (princ (apply 'format format-string args
)))
135 (let ((input (readln "user> ")))
138 (println (rep input
))
140 ;; empty input, carry on
142 (unterminated-sequence
143 (let* ((type (cadr err
))
146 ((eq type
'string
) ?
\")
147 ((eq type
'list
) ?\
))
148 ((eq type
'vector
) ?\
])
149 ((eq type
'map
) ?
}))))
150 (princ (format "Expected '%c', got EOF\n" end
))))
152 (println (error-message-string err
))))
154 ;; print final newline