我正在阅读 On Lisp,但无法弄清楚为什么下面的代码使用了引号。以下是文本的摘录:
为用户保留的另一个字符组合是#[。图 17.3 给出了一个例子,说明如何将这个字符定义为一种更精细的左括号。它定义了一个 #[xy] 形式的表达式,以将其读取为 x 和 y 之间所有整数的列表,包括:
#[2 7] (2 3 4 5 6 7)
图 17.3:定义分隔符的读取宏。
(set-macro-character #\] (get-macro-character #\))) (set-dispatch-macro-character #\# #\[ #'(lambda (stream char1 char2) (let ((accum nil) (pair (read-delimited-list #\] stream t))) (do ((i (ceiling (car pair)) (1+ i))) ((> i (floor (cadr pair))) (list 'quote (nreverse accum))) (push i accum))))) Figure 17.3: A read-macro defining delimiters.
我不明白为什么do** 的结果表单中的行是 **(list 'quote (nreverse accum)))而不是 (nreverse accum)。因为我们可以毫无问题地运行下面不使用引号的代码,对吧?
(let ((acc nil))
(do ((i 2 (1+ i)))
((> i 7)
(nreverse acc))
(push i acc)))
有人知道这里的诀窍吗?