如何将列表传递给常见的lisp中的宏?

Wei*_* Li 1 common-lisp

我正在尝试将列表传递给宏,例如:

(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类型".

所以,我的问题是,这段代码有什么问题以及如何将列表传递给宏?

fin*_*nnw 8

我不确定为什么要将它定义为宏而不是常规函数,但问题是宏不会​​评估它们的参数.如果你给它一个词法变量的名称,它所看到的只是name('LST),而不是绑定值.它正在抱怨(正确)该符号'LST不是列表,因此不是有效的第二个参数MAPCAR.

你可以把它称为(print-lst (1 2 3)),但是你可以没有宏,只是这样做(mapc #'print lst)