如果要将 item 转换为 form (quote item)
,则必须提供转换。
例如(list 'quote item)
或
`(quote ,item)
如果您在函数中使用特殊形式或宏,则可以使用该函数并将其传递给类似MAPCAR
.
CL-USER > (mapcar #'(lambda (item) (list 'quote item)) '(1 2 3 4))
((QUOTE 1) (QUOTE 2) (QUOTE 3) (QUOTE 4))
如果列表被替换为变量,这也有效。
如果您想将其编写为宏,那么您会遇到获取源代码并且需要对其进行转换的问题。如果你有一个列表,那么你可以直接转换它。例如,如果您有一个变量,那么您就不能(因为您不知道该变量的值)并且您必须将转换包含到生成的源中。
例子:
CL-USER 119 > (defmacro quoter (list)
(list 'quote (mapcar (lambda (item) (list 'quote item))
(second list))))
QUOTER
CL-USER 120 > (macroexpand '(quoter '(1 2 3 4)))
(QUOTE ((QUOTE 1) (QUOTE 2) (QUOTE 3) (QUOTE 4)))
T
CL-USER 121 > (quoter '(1 2 3 4))
((QUOTE 1) (QUOTE 2) (QUOTE 3) (QUOTE 4))
但现在它不知道该怎么办(quoter some-variable)
。现在你不能转换一个列表——因为它是未知的。现在您需要提供一个宏扩展,它将在运行时进行转换......