【发布时间】:2014-11-10 01:21:37
【问题描述】:
我正在阅读 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 来存储扁平列表。
【问题讨论】:
-
有lots of questions about flatten;这可能是其中之一的副本。如果没有,这些仍然可能会有所帮助。
-
@JoshuaTaylor 最疯狂的是,大多数带有
flatten的lisp 问题要么是Scheme 问题,要么是类似于但不完全像flatten问题的请求。我知道 Will 在他们当中有一个很好的答案,但我猜只是回答比找到它更容易。此外,他在实施方面需要帮助,我没有评论他实际上是如何做到的,因为在 CL 标准中它看起来对我来说没问题。 (自我提醒:为好的答案添加书签) -
正如我所说,我在搜索中也没有找到重复项,但我希望找到 this 关于扁平化列表的问题的人也可能会找到 那些关于扁平化列表的问题也很有用。
-
在亚历山大图书馆:
flattencommon-lisp.net/project/alexandria/draft/alexandria.html#Conses“按顺序遍历树,将非空叶子收集到一个列表中。”。
标签: linked-list lisp common-lisp flatten on-lisp