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
相关产品推荐
相关产品推荐

