Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/google-app-engine/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
lisp宏是否计算过表达式,或者只是进行转换?_Lisp_Common Lisp - Fatal编程技术网

lisp宏是否计算过表达式,或者只是进行转换?

lisp宏是否计算过表达式,或者只是进行转换?,lisp,common-lisp,Lisp,Common Lisp,我是lisps新手,来自c语言背景。我正在努力理解lisp宏。我知道他们会从一组表达式到另一组表达式进行任意转换,但他们在扩展时会计算表达式吗 可以想象一个宏递归地从传入列表中删除一个项,直到列表中没有剩余的元素。它必须评估列表的大小,才能知道何时停止扩展。这可能吗?宏计算源代码。如果您的源代码是一个列表,那么您可以使用它进行计算。由于Lisp源代码是列表,宏通常计算列表。宏计算源代码。如果您的源代码是一个列表,那么您可以使用它进行计算。由于Lisp源代码是列表,宏通常计算列表。 CL-USER

我是lisps新手,来自c语言背景。我正在努力理解lisp宏。我知道他们会从一组表达式到另一组表达式进行任意转换,但他们在扩展时会计算表达式吗


可以想象一个宏递归地从传入列表中删除一个项,直到列表中没有剩余的元素。它必须评估列表的大小,才能知道何时停止扩展。这可能吗?

宏计算源代码。如果您的源代码是一个列表,那么您可以使用它进行计算。由于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