我正在阅读 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
来存储展平列表。