diff options
author | Kaz Kylheku <kaz@kylheku.com> | 2015-05-15 07:03:44 -0700 |
---|---|---|
committer | Kaz Kylheku <kaz@kylheku.com> | 2015-05-15 07:03:44 -0700 |
commit | 7b0341d13bab3e7c2202327d56d150e2c7887045 (patch) | |
tree | 0974a29fb73e2573b9729b2133627d1be30893a6 | |
parent | f1cb385c90eb80200c36fa2628e023958472ec39 (diff) | |
download | txr-7b0341d13bab3e7c2202327d56d150e2c7887045.tar.gz txr-7b0341d13bab3e7c2202327d56d150e2c7887045.tar.bz2 txr-7b0341d13bab3e7c2202327d56d150e2c7887045.zip |
Variables are now deletable places, if they are global.
* place.tl (sys:sym-delete-expander): New function.
(get-delete-expander): Retrieve delete expander for
symbols.
-rw-r--r-- | ChangeLog | 8 | ||||
-rw-r--r-- | place.tl | 20 | ||||
-rw-r--r-- | txr.1 | 2 |
3 files changed, 25 insertions, 5 deletions
@@ -1,5 +1,13 @@ 2015-05-15 Kaz Kylheku <kaz@kylheku.com> + Variables are now deletable places, if they are global. + + * place.tl (sys:sym-delete-expander): New function. + (get-delete-expander): Retrieve delete expander for + symbols. + +2015-05-15 Kaz Kylheku <kaz@kylheku.com> + * eval.c (symbol_value): Retrieve the binding of a symbol macro also. (boundp): Return t for symbol macros. @@ -72,6 +72,17 @@ ,',place-expr ,val-expr))) ,op-body)) + (defun sys:sym-delete-expander (deleter-name + place-expr . op-body) + ^(macrolet ((,deleter-name (:env env) + (when (lexical-var-p env ',place-expr) + (sys:eval-err "~s is a lexical variable, thus not deletable" + ',place-expr)) + ^(prog1 + (symbol-value ',',place-expr) + (makunbound ',',place-expr)))) + ,*op-body)) + (defun get-update-expander (place) (cond ((symbolp place) (fun sys:sym-update-expander)) @@ -89,10 +100,11 @@ (t (sys:eval-err "form ~s is not syntax denoting an assignable place" place)))) (defun get-delete-expander (place) - (if (consp place) - (or [*place-delete-expander* (car place)] - (sys:eval-err "~s is not a deletable place" place)) - (sys:eval-err "form ~s is not syntax denoting a deletable place" place)))) + (cond + ((symbolp place) (fun sys:sym-delete-expander)) + ((consp place) (or [*place-delete-expander* (car place)] + (sys:eval-err "~s is not a deletable place" place))) + (t (sys:eval-err "form ~s is not syntax denoting a deletable place" place))))) (defmacro rlet (bindings :env e . body) (let ((exp-bindings (mapcar (aret ^(,@1 ,(macroexpand @2 e))) bindings))) @@ -11840,7 +11840,7 @@ operator binding is returned, and if that doesn't exist, then .code nil is returned. -The value of a macro binding isn't a functio object, but a list of the +The value of a macro binding isn't a function object, but a list of the following form: .cblk |