summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKaz Kylheku <kaz@kylheku.com>2015-05-15 07:03:44 -0700
committerKaz Kylheku <kaz@kylheku.com>2015-05-15 07:03:44 -0700
commit7b0341d13bab3e7c2202327d56d150e2c7887045 (patch)
tree0974a29fb73e2573b9729b2133627d1be30893a6
parentf1cb385c90eb80200c36fa2628e023958472ec39 (diff)
downloadtxr-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--ChangeLog8
-rw-r--r--place.tl20
-rw-r--r--txr.12
3 files changed, 25 insertions, 5 deletions
diff --git a/ChangeLog b/ChangeLog
index 77a01b0d..82fcffbb 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -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.
diff --git a/place.tl b/place.tl
index d421d4fa..85b0a55f 100644
--- a/place.tl
+++ b/place.tl
@@ -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)))
diff --git a/txr.1 b/txr.1
index 7c6328fa..39331d63 100644
--- a/txr.1
+++ b/txr.1
@@ -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