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

Emacs 如何更改函数体执行的顺序?,emacs,elisp,Emacs,Elisp,我正在按照介绍学习Emacs Lisp 我可以理解下面的defun以从左到右的顺序打印列表,因为print命令位于递归之前(据我所知): 例如,查看”(瞪羚长颈鹿狮子虎)。印刷顺序为羚羊、长颈鹿、狮子、老虎 但是,我无法理解,当我在主体中切换两个表达式的位置时,为什么仍然保持相同的顺序: (defun print-elements-recursively (list) "Print each element of LIST on a line of its own. Uses recur

我正在按照介绍学习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
                       ; body
         (print-elements-recursively     ; recursive call
          (cdr list))
         (print (car list))))                  ; next-step-expression

按照我的预期,递归发生在
print
函数之前,因此,顺序应该颠倒。我可以知道原因吗?

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

我建议你

  • 重命名其中一个
    defun
    s
  • 对两者进行评估
  • 然后分别给他们打电话
这样做时,该行为不应持续



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

我无法重现您描述的行为。评估第一个
defun
后,项目顺序为
gazelle
tiger
,计算第二个
defun
后,顺序颠倒。我建议您重命名其中一个
defun
s,对它们进行求值,然后分别调用它们。“当你这样做的时候,这种行为还会持续吗?”我明白了。的确,改名后的第二次执行产生了预期的结果。好吧,太好了,我会发表我的评论作为回答:)我不明白为什么你会在这个问题上得到很多反对票。你清楚地说明了你想做什么,你的问题是什么,所以你应该没事。
(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