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

Lisp宏使用loop-for-collect时出现未绑定变量问题求助

解决Common Lisp宏check-i-o的未绑定变量错误

你的问题出在宏展开时的变量作用域上:loop里的i-o是宏展开阶段的临时变量,但你内层反引号里的(first i-o)和(second i-o)没有对i-o进行反引用,导致最终生成的代码里保留了i-o这个符号——而运行时根本没有绑定这个变量,所以报错The variable I-O is unbound。

举个例子,你的原代码展开(check-i-o 1+ (2 3))会得到:

(check (= (1+ (first i-o)) (second i-o)))

这里的i-o在运行时完全没定义,自然报错。

正确的做法是在宏展开阶段就把每组输入输出对拆成具体的值,直接嵌入生成的代码里。修改后的宏如下:

(defmacro check-i-o (function &body inputs-outputs)
  `(check
    ,@(loop for (input output) in inputs-outputs
            collect `(= (,function ,input) ,output))))

关键修改点:

  • 用(input output)解构inputs-outputs里的每一项,在宏展开时就把(2 3)拆成input=2、output=3
  • 生成的代码直接使用input和output的具体值,不再依赖运行时的变量

现在调用(check-i-o 1+ (2 3) (3 4))会正确展开为:

(check (= (1+ 2) 3) (= (1+ 3) 4))

完全符合你的预期,运行时也不会有变量未绑定的问题。

内容的提问来源于stack exchange,提问作者banana bajanana

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 16:29:58