You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

自定义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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 17:44:55