我正在阅读 Paul Graham 的《On Lisp》一书。在第 4 章“实用函数”中,他给出了对列表进行操作的小函数的示例,这对编写较大的程序很有帮助。
其中之一是flatten。给定任意级别的嵌套列表作为参数,flatten 将删除所有嵌套元素并将它们放在顶层。
以下是我实现扁平化的尝试:
(defun flatten (lst)
(labels ((rflatten (lst1 acc)
(dolist (el lst1)
(if (listp el)
(rflatten el acc)
(push el acc)))
acc))
(reverse (rflatten lst nil))))
但是上面的函数不能正确地展平列表。
; returns (1) instead of (1 2)
(print (flatten '(1 (2))))
(1)
(1 (2))使用返回(1)而不是调用函数(1 2)。
我找不到我的扁平化实现有什么问题。是我使用的方式
labels吗?还是我使用dolist宏的方式?dolist宏总是nil返回。但这并不重要,因为我正在使用累加器acc来存储展平列表。