summaryrefslogtreecommitdiffstats
path: root/place.tl
diff options
context:
space:
mode:
Diffstat (limited to 'place.tl')
-rw-r--r--place.tl20
1 files changed, 16 insertions, 4 deletions
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)))