我正在尝试将列表传递给宏,例如:
(defmacro print-lst (lst)
`(progn
,@(mapcar #'(lambda (x) `(print ,x)) lst)))
(let ((lst '(1 2 3)))
(print-lst lst))
Run Code Online (Sandbox Code Playgroud)
它发现错误:"LST值不是LST类型".
所以,我的问题是,这段代码有什么问题以及如何将列表传递给宏?
我不确定为什么要将它定义为宏而不是常规函数,但问题是宏不会评估它们的参数.如果你给它一个词法变量的名称,它所看到的只是name('LST
),而不是绑定值.它正在抱怨(正确)该符号'LST
不是列表,因此不是有效的第二个参数MAPCAR
.
你可以把它称为(print-lst (1 2 3))
,但是你可以没有宏,只是这样做(mapc #'print lst)