From 7b0341d13bab3e7c2202327d56d150e2c7887045 Mon Sep 17 00:00:00 2001 From: Kaz Kylheku Date: Fri, 15 May 2015 07:03:44 -0700 Subject: 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. --- ChangeLog | 8 ++++++++ place.tl | 20 ++++++++++++++++---- txr.1 | 2 +- 3 files changed, 25 insertions(+), 5 deletions(-) diff --git a/ChangeLog b/ChangeLog index 77a01b0d..82fcffbb 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,11 @@ +2015-05-15 Kaz Kylheku + + 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 * eval.c (symbol_value): Retrieve the binding of a symbol 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 -- cgit v1.2.3