代码之家  ›  专栏  ›  技术社区  ›  syd

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

  •  2
  • syd  · 技术社区  · 7 年前

    我有一个宏,它是一个“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 回复  |  直到 7 年前
        1
  •  3
  •   Rainer Joswig mmmmmm    7 年前

    单个返回值的示例:

    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