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

时间:2014-08-18 12:04:53

标签: emacs elisp

我正在通过介绍来研究Emacs-Lisp。

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

  (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)列表。打印订单为gazellegiraffeliontiger

然而,当我在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 个答案:

答案 0 :(得分:2)

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

我建议你

  • 重命名其中一个defun s
  • 评估他们两个
  • 然后分别调用它们中的每一个。

当你这样做时,行为不应该持久。


除了以不同顺序打印列表元素之外,还要注意原始函数返回nil,第二个函数返回最后一个print ed表示(非{{1}输入列表的项目。这是因为nil返回(when list),并且是在第一个函数中到达基本案例时得到的最后一个表达式。在第二个函数中,在达到基本案例后,对nil的所有调用进行评估。