Next: 具有增量计数器的循环, Previous: 使用 while 循环和列表, Up: while   [Contents][Index]


11.1.2 示例:print-elements-of-list 函数

print-elements-of-list 函数演示了使用列表的 while 循环。

该函数需要多行输出。如果您正在使用最近版本的 GNU Emacs 阅读此文档,您可以像往常一样在 Info 中评估以下表达式。

如果您使用较早版本的 Emacs,则需要将必要的表达式复制到 *scratch* 缓冲区并在那里进行评估。这是因为早期版本的回显区只有一行。

您可以通过使用 C-SPC(set-mark-command)标记区域的开头,将光标移动到区域的末尾,然后使用 M-w(kill-ring-save,它调用 copy-region-as-kill 并提供视觉反馈)来复制区域。在 *scratch* 缓冲区中,您可以通过键入 C-y(yank)将表达式还原。

在将表达式复制到 *scratch* 缓冲区后,逐个评估每个表达式。确保通过键入 C-u C-x C-e 评估最后一个表达式 (print-elements-of-list animals),即通过给 eval-last-sexp 提供参数。这将导致评估的结果在 *scratch* 缓冲区中打印,而不是在回显区中打印(否则您将在回显区中看到类似于这样的内容:^Jgazelle^J^Jgiraffe^J^Jlion^J^Jtiger^Jnil,其中每个 ‘^J’ 代表一个换行符)。

您可以直接在 Info 缓冲区中评估这些表达式,回显区将增大以显示结果。

(setq animals '(gazelle giraffe lion tiger))

(defun print-elements-of-list (list)
  "逐行打印 LIST 的每个元素。"
  (while list
    (print (car list))
    (setq list (cdr list))))

(print-elements-of-list animals)

当您按顺序评估这三个表达式时,将看到以下结果:

gazelle

giraffe

lion

tiger
nil

列表的每个元素都打印在自己的一行上(这是函数 print 的作用),然后打印函数的返回值。由于函数中的最后一个表达式是 while 循环,而且由于 while 循环总是返回 nil,因此在列表的最后一个元素后打印了一个 nil。