1 (defun mal-env (&optional outer binds exprs
)
2 (let ((env (vector 'env
(vector (make-hash-table :test
'eq
) outer
))))
4 (let ((key (pop binds
)))
6 (let ((key (pop binds
))
7 (value (mal-list exprs
)))
8 (mal-env-set env key value
)
11 (let ((value (pop exprs
)))
12 (mal-env-set env key value
)))))
15 (defun mal-env-set (env key value
)
16 (let ((data (aref (aref env
1) 0)))
17 (puthash key value data
)))
19 (defun mal-env-find (env key
)
20 (let* ((data (aref (aref env
1) 0))
21 (value (gethash key data
)))
23 (let ((outer (aref (aref env
1) 1)))
25 (mal-env-find outer key
)))
28 (defun mal-env-get (env key
)
29 (let ((value (mal-env-find env key
)))
31 (error "'%s' not found" key
)