Macros 宏的结果必须是主体中最后一个表达式的值
我有一个宏,它是一个“for”循环,它工作得很好Macros 宏的结果必须是主体中最后一个表达式的值,macros,lisp,common-lisp,labels,Macros,Lisp,Common Lisp,Labels,我有一个宏,它是一个“for”循环,它工作得很好 (defmacro for ((parameter start-value end-value &optional (step 1)) &body e) (let ((func-name (gensym)) (step-name (gensym))
(defmacro for ((parameter start-value end-value
&optional (step 1))
&body e)
(let ((func-name (gensym))
(step-name (gensym))
(end (gensym)))
`(labels ((,func-name (,parameter ,end ,step-name)
(when (<= ,parameter ,end)
,@e
(,func-name (+ ,parameter ,step-name)
,end
,step-name))))
(,func-name ,start-value ,end-value ,step))))
((参数开始值结束值
&可选(步骤1))
&正文(e)
(let((函数名(gensym))
(步骤名称(gensym))
(完(gensym))
`(标签(,函数名称(,参数,结束,步骤名称)
(当(单个返回值的示例:
CL-USER 38 > (defmacro for ((parameter start-value end-value
&optional (step 1))
&body e)
(let ((func-name (gensym))
(step-name (gensym))
(end (gensym))
(last-name (gensym)))
`(labels ((,func-name (,parameter ,end ,step-name ,last-name)
(if (<= ,parameter ,end)
(,func-name (+ ,parameter ,step-name)
,end
,step-name
(progn ,@e))
,last-name)))
(,func-name ,start-value ,end-value ,step nil))))
FOR
CL-USER 39 > (let ((j 0) (k 1))
(for (i 1 10 (incf k))
(print i)))
1
3
5
7
9
9 ; the return value
CL-USER 38>(参数开始值结束值
&可选(步骤1))
&正文(e)
(let((函数名(gensym))
(步骤名称(gensym))
(完(简讯)
(姓(gensym)))
`(标签(,函数名(,参数,结束,步骤名,姓氏)
(如果((让((j 0)(k 1))
(适用于(i)110(incf k))
(印本一)
1.
3.
5.
7.
9
9;返回值
如果主体接受多个表达式,则需要(progn,@e)
。这种测试不起作用:(对于(新el 1 5)(print(+new el 2)(print(-new el 2)))
@AntonKaravaev:代码中的括号是错误的。修复后,它返回3,这在我看来很好。。。