Common Lisp中是否可以取消定义symbol macro(符号宏)?
符号宏的取消定义方法
标准Common Lisp没有提供内置的通用接口来直接取消全局符号宏的定义,你提到的makunbound和fmakunbound仅能作用于普通变量绑定、函数/普通宏绑定,无法操作符号宏的绑定。
常见的处理方案有两类:
- 对应具体Lisp实现调用扩展接口
主流实现都提供了私有的符号宏取消定义接口:- SBCL 可调用
sb-ext:undefine-symbol-macro - CCL 可调用
ccl:undefine-symbol-macro
调用示例:
;; 先定义测试符号宏 (define-symbol-macro +test-val+ 100) ;; 取消符号宏定义 (sb-ext:undefine-symbol-macro '+test-val+) - SBCL 可调用
- 跨实现兼容方案
如果需要适配所有标准Common Lisp实现,可以通过将符号宏重新定义为展开到自身的方式,模拟取消定义的效果,后续引用该符号时不会再触发原有的符号宏展开逻辑:(define-symbol-macro +test-val+ +test-val+)
你提到的删除符号宏所在包的方案完全不推荐使用,删除包仅会修改符号的归属状态,不会清除符号上已绑定的符号宏定义,且删除包后原属该包的符号的家包状态由具体实现决定,行为不可控,无法达到稳定取消符号宏定义的目的。
内容的提问来源于stack exchange,提问作者CL-USER
相关产品推荐
相关产品推荐

