我有一个这个宏,它是一个“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
。那我该怎么办?
答案 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