宏的结果必须是正文中最后一个表达式的值

时间:2018-01-05 21:54:34

标签: 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))
                 (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))))

但我需要我的宏的结果是身体(身体)中最后一个表达式的值。现在(在此代码中)结果始终为nil。那我该怎么办?

1 个答案:

答案 0 :(得分:3)

单个返回值的示例:

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