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

如何更改函数体执行的顺序?

  •  1
  • modeller  · 技术社区  · 10 年前

    我正在按照介绍学习Emacs Lisp。

    我可以理解下面的defun按从左到右的顺序打印列表,因为打印命令在递归之前出现(正如我所理解的):

      (defun print-elements-recursively (list)
       "Print each element of LIST on a line of its own.
     Uses recursion."
       (when list                            ; do-again-test
             (print (car list))              ; body
             (print-elements-recursively     ; recursive call
              (cdr list))))                  ; next-step-expression
    

    E、 g.列表 '(gazelle giraffe lion tiger) 。打印顺序为 gazelle , giraffe , lion , tiger .

    然而,我无法理解当我在 when 正文:

    (defun print-elements-recursively (list)
       "Print each element of LIST on a line of its own.
     Uses recursion."
       (when list                            ; do-again-test
                           ; body
             (print-elements-recursively     ; recursive call
              (cdr list))
             (print (car list))))                  ; next-step-expression
    

    按照我的预期,递归发生在 print 因此,顺序应该颠倒。我可以知道为什么吗?

    1 回复  |  直到 10 年前
        1
  •  2
  •   itsjeyd    10 年前

    你可能没有评估第二个 defun 这就是为什么输入列表的项目仍按原始顺序打印。将具有相同名称的第二个函数添加到全局命名空间并不意味着第一个函数的定义被自动覆盖。

    我建议你

    • 重命名 去燃料的 s
    • 对两者进行评估
    • 然后分别调用它们中的每一个。

    当你这样做时,这种行为不应该持续下去。


    除了以不同的顺序打印列表的元素外,还要注意原始函数返回 nil 第二个函数返回 print 最后(非- )输入列表的项。这是因为 (when list) 回报 并且是在第一个函数中达到基本情况时计算的最后一个表达式。在第二个函数中 打印 被评估 之后 达到基本情况。