自定义Common Lisp if宏行为不符预期的原因排查
Common Lisp自定义
if宏异常问题排查 问题场景
在LO包中定义了如下自定义if宏(该包:use Common Lisp并:shadow了cl:if):
(defmacro if (test-form &body body) (let ((test (gensym))) `(let ((,test (cl:if (booleanp ,test-form) (cl-truth ,test-form) ,test-form))) (cl:if ,test ,@body))))
执行表达式 (if (wordp (wordify "")) (print 1) (print 0)) 时,结果为NIL,不符合预期。但手动用destructuring-bind模拟宏展开后的代码执行,能得到预期结果1,同时调用macroexpand-1对该表达式展开时返回=> NIL, NIL。
原因定位
排查发现LO包中存在一个遗留的空定义if宏:
(defmacro if (test-form &body body) ())
这个空宏定义会覆盖后续的正确宏定义,导致实际生效的是这个空实现。由于空宏展开返回NIL,执行时不会生成任何有效代码,最终结果为NIL,同时macroexpand-1也返回NIL, NIL。
解决方法
删除LO包中遗留的空if宏定义,重新加载正确的自定义if宏即可恢复正常行为。
内容的提问来源于stack exchange,提问作者Demihm Seinname
相关产品推荐
相关产品推荐

