1 (defun load-relative (file)
2 (let* ((current-file (or load-file-name buffer-file-name
))
3 (current-file-directory (file-name-directory current-file
)))
4 (load (expand-file-name file current-file-directory
) nil t
)))
6 (load-relative "types.el")
7 (load-relative "reader.el")
8 (load-relative "printer.el")
10 (defvar repl-env
(make-hash-table :test
'eq
))
11 (puthash '+ (lambda (a b
) (mal-number (+ (mal-value a
) (mal-value b
)))) repl-env
)
12 (puthash '-
(lambda (a b
) (mal-number (- (mal-value a
) (mal-value b
)))) repl-env
)
13 (puthash '* (lambda (a b
) (mal-number (* (mal-value a
) (mal-value b
)))) repl-env
)
14 (puthash '/ (lambda (a b
) (mal-number (/ (mal-value a
) (mal-value b
)))) repl-env
)
20 (if (and (mal-list-p ast
) (mal-value ast
))
21 (let* ((ast* (mal-value (eval-ast ast env
)))
27 (defun eval-ast (ast env
)
28 (let ((type (mal-type ast
))
29 (value (mal-value ast
)))
32 (let ((definition (gethash value env
)))
33 (or definition
(error "Definition not found"))))
35 (mal-list (mapcar (lambda (item) (EVAL item env
)) value
)))
37 (mal-vector (vconcat (mapcar (lambda (item) (EVAL item env
)) value
))))
39 (let ((map (copy-hash-table value
)))
40 (maphash (lambda (key value
)
41 (puthash key
(EVAL value env
) map
))
52 (PRINT (EVAL (READ input
) repl-env
)))
54 (defun readln (prompt)
55 ;; C-d throws an error
56 (ignore-errors (read-from-minibuffer prompt
)))
58 (defun println (format-string &rest args
)
61 (princ (apply 'format format-string args
)))
67 (let ((input (readln "user> ")))
72 ;; empty input, carry on
74 (unterminated-sequence
75 (let* ((type (cadr err
))
78 ((eq type
'string
) ?
\")
80 ((eq type
'vector
) ?\
])
81 ((eq type
'map
) ?
}))))
82 (princ (format "Expected '%c', got EOF\n" end
))))
84 (println (error-message-string err
))
87 ;; print final newline