Macros 宏的结果必须是主体中最后一个表达式的值

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))

我有一个宏,它是一个“for”循环,它工作得很好

(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,这在我看来很好。。。