取消定义符号宏

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

我不知道在其他实现中会发生什么。