diff options
author | Kaz Kylheku <kaz@kylheku.com> | 2015-05-22 06:13:49 -0700 |
---|---|---|
committer | Kaz Kylheku <kaz@kylheku.com> | 2015-05-22 06:13:49 -0700 |
commit | 22e6568de7fe351974057e57d17078fd8f2b442b (patch) | |
tree | 7e41d28a500dd0d556b9ab429b9d5c45de9bc78f /place.tl | |
parent | ecc85df1f89e968089a3ad2498bc0138a09d95a4 (diff) | |
download | txr-22e6568de7fe351974057e57d17078fd8f2b442b.tar.gz txr-22e6568de7fe351974057e57d17078fd8f2b442b.tar.bz2 txr-22e6568de7fe351974057e57d17078fd8f2b442b.zip |
symbol-function, symbol-value and fun become places.
* eval.c (op_setqf): New function.
(eval_init): Register sys:setqf operator. Also expose
global variable hash tables via sys:top-vb and sys:top-fb.
* place.tl (sys:get-fb, sys:get-vb): New functions.
(fun, symbol-function, symbol-value): New places defined.
Diffstat (limited to 'place.tl')
-rw-r--r-- | place.tl | 47 |
1 files changed, 47 insertions, 0 deletions
@@ -481,6 +481,53 @@ (progn (errno ,val-sym) ,val-sym))))) ,body))) + (defplace (fun sym) body + (getter setter + ^(macrolet ((,getter () ^(fun ,',sym)) + (,setter (val) ^(sys:setqf ,',sym ,val))) + ,*body)) + : + (deleter + ^(macrolet ((,deleter (:env env) + (when (lexical-fun-p env ',sym) + (sys:eval-err "~s is a lexical function, \ + \ thus not deletable" + ',sym)) + ^(fmakunbound ',',sym))) + ,*body))) + + (defun sys:get-fb (sym) + (or (gethash sys:top-fb sym) + (sys:eval-err "unbound function ~s" sym))) + + (defplace (symbol-function sym-expr) body + (getter setter + (with-gensyms (binding-sym) + ^(let ((,binding-sym (sys:get-fb ,sym-expr))) + (macrolet ((,getter () ^(cdr ,',binding-sym)) + (,setter (val) ^(sys:rplacd ,',binding-sym ,val))) + ,*body)))) + : + (deleter + ^(macrolet ((,deleter () ^(fmakunbound ,',sym-expr))) + ,*body))) + + (defun sys:get-vb (sym) + (or (gethash sys:top-vb sym) + (sys:eval-err "unbound variable ~s" sym))) + + (defplace (symbol-value sym-expr) body + (getter setter + (with-gensyms (binding-sym) + ^(let ((,binding-sym (sys:get-vb ,sym-expr))) + (macrolet ((,getter () ^(cdr ,',binding-sym)) + (,setter (val) ^(sys:rplacd ,',binding-sym ,val))) + ,*body)))) + : + (deleter + ^(macrolet ((,deleter () ^(makunbound ,',sym-expr))) + ,*body))) + (macro-time (each ((from '(car cdr)) (to '(first rest))) |