lisp宏是否计算过表达式,或者只是进行转换?
我是lisps新手,来自c语言背景。我正在努力理解lisp宏。我知道他们会从一组表达式到另一组表达式进行任意转换,但他们在扩展时会计算表达式吗lisp宏是否计算过表达式,或者只是进行转换?,lisp,common-lisp,Lisp,Common Lisp,我是lisps新手,来自c语言背景。我正在努力理解lisp宏。我知道他们会从一组表达式到另一组表达式进行任意转换,但他们在扩展时会计算表达式吗 可以想象一个宏递归地从传入列表中删除一个项,直到列表中没有剩余的元素。它必须评估列表的大小,才能知道何时停止扩展。这可能吗?宏计算源代码。如果您的源代码是一个列表,那么您可以使用它进行计算。由于Lisp源代码是列表,宏通常计算列表。宏计算源代码。如果您的源代码是一个列表,那么您可以使用它进行计算。由于Lisp源代码是列表,宏通常计算列表。 CL-USER
可以想象一个宏递归地从传入列表中删除一个项,直到列表中没有剩余的元素。它必须评估列表的大小,才能知道何时停止扩展。这可能吗?宏计算源代码。如果您的源代码是一个列表,那么您可以使用它进行计算。由于Lisp源代码是列表,宏通常计算列表。宏计算源代码。如果您的源代码是一个列表,那么您可以使用它进行计算。由于Lisp源代码是列表,宏通常计算列表。
CL-USER 11 > (defmacro consume-list (list)
(if (null list) ; empty list?
()
(list 'consume-list (rest list)))) ; remove first element
CONSUME-LIST
CL-USER 12 > (macroexpand-1 '(consume-list (a b c))) ; expand once
(CONSUME-LIST (B C)) ; first element has been removed
T
CL-USER 13 > (macroexpand '(consume-list (a b c))) ; expand to completion
NIL ; everything has been removed
T