取消定义符号宏
Undefining a symbol macro
是否可以取消定义符号宏?可以使用 f/makunbound 取消定义常规变量、宏和函数,但我似乎找不到删除符号宏的方法。
我考虑过完全删除它们所在的包,但考虑到 CLHS 对 symbols in deleted packages:
的说明,这似乎是一个有问题的解决方案
After this operation completes, the home package of any symbol whose
home package had previously been package is implementation-dependent.
Except for this, symbols accessible in package are not modified in any
other way; symbols whose home package is not package remain unchanged.
所以即使它有效,它实际上只是将它们重新安置到一些依赖于实现的位置。
看起来你最好的(便携式和可靠)赌注是unintern
:
(defvar *things* (list 'alpha 'beta 'gamma))
(define-symbol-macro thing1 (first *things*))
thing1
; ==> ALPHA
(unintern 'thing1)
thing1
; ==> The variable THING1 is unbound.
请注意,这也会丢失函数绑定、属性等。
另一种方法是注意define-symbol-macro
"conflicts" with defvar
:
(defvar thing1)
将从 thing1
.
中删除全局符号宏定义
请注意,它将在 SBCL 中以静默方式执行,并通过 CLISP 中的持续错误(用于相反顺序的对称):
(defvar thing1)
(define-symbol-macro thing1 (first *things*))
; ==> PROGRAM-ERROR
我不知道在其他实现中会发生什么。
是否可以取消定义符号宏?可以使用 f/makunbound 取消定义常规变量、宏和函数,但我似乎找不到删除符号宏的方法。
我考虑过完全删除它们所在的包,但考虑到 CLHS 对 symbols in deleted packages:
的说明,这似乎是一个有问题的解决方案After this operation completes, the home package of any symbol whose home package had previously been package is implementation-dependent. Except for this, symbols accessible in package are not modified in any other way; symbols whose home package is not package remain unchanged.
所以即使它有效,它实际上只是将它们重新安置到一些依赖于实现的位置。
看起来你最好的(便携式和可靠)赌注是unintern
:
(defvar *things* (list 'alpha 'beta 'gamma))
(define-symbol-macro thing1 (first *things*))
thing1
; ==> ALPHA
(unintern 'thing1)
thing1
; ==> The variable THING1 is unbound.
请注意,这也会丢失函数绑定、属性等。
另一种方法是注意define-symbol-macro
"conflicts" with defvar
:
(defvar thing1)
将从 thing1
.
请注意,它将在 SBCL 中以静默方式执行,并通过 CLISP 中的持续错误(用于相反顺序的对称):
(defvar thing1)
(define-symbol-macro thing1 (first *things*))
; ==> PROGRAM-ERROR
我不知道在其他实现中会发生什么。