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)
  "Print each element of LIST on a line of its own."
  (while list
    (print (car list))
    (setq list (cdr list))))

(print-elements-of-list animals)

依次执行这三个表达式后,你会看到如下输出:

gazelle

giraffe

lion

tiger
nil

列表中的每个元素都会单独占一行打印(这是 print 函数的行为),随后会打印函数的返回值。由于函数内最后一个表达式是 while 循环,而 while 循环总是返回 nil,因此在列表最后一个元素之后会输出一个 nil。