关于这个 "flatten the nested list" 问题,这本书 answer-sheet 是不是错了?

Is the book's answer-sheet wrong about this "flatten the nested list" problem?

我正在尝试通过 Common Lisp:对符号计算的简单介绍 来学习 Common Lisp。此外,我正在使用 SBCL、Emacs 和 Slime。

在第8章中,作者提出了递归的概念。更具体地说,他展示了 cad/cdr 树上的递归。关于这个主题的练习之一是如何扁平化嵌套列表:

奇怪的是 answer-sheet 中出现的正确答案是:

本书的 answer-sheet 解决方案 在我的环境下 没有使用问题中提供的示例生成预期结果。

(defun flatten-book (tree)
  (cond ((atom tree) (list tree))
         (t (append (flatten-book (car tree))
                    (flatten-book (cdr tree))))))

全是NIL,不应该。因此,我开始了我的 REPL:

CL-USER> (flatten-book '((A B (R)) A C (A D ((A (B)) R) A)))
(A B R NIL NIL A C A D A B NIL NIL R NIL A NIL NIL)

为了获得预期的结果,我需要更改插入 null clause 的方法:

(defun my-flatten (tree)
  (cond ((null tree) nil)
        ((atom tree) (list tree))
        (t (append (my-flatten (car tree))
                   (my-flatten (cdr tree))))))

本returns正确答案:

CL-USER> (my-flatten '((A B (R)) A C (A D ((A (B)) R) A)))

(A B R A C A D A B R A)

到目前为止,我非常喜欢这本书。而且它似乎是Common Lispers中的经典。

这是本书answer-sheet中的错误吗?我错过了什么?也许是历史性的改变?也许与不同的编译器有关?

书错了。

然而,通过这个小改动,书中的答案再次起作用:

(defun flatten (tree)
  (cond ((null tree) tree) ;; this case was forgotten by the book!
        ((atom tree) (list tree))
        (t (append (flatten (car tree))
                   (flatten (cdr tree))))))