【发布时间】:2016-07-26 08:15:44
【问题描述】:
我必须在我写过的几乎每个 Lisp 程序中重新实现一个特定的功能。既然这个功能这么好用,肯定是之前实现过的。我希望它是众所周知的。也许它是 Common Lisp 标准库的一部分。它叫什么,来自哪个库?
(defun unknown-function (predicate tree)
(loop for item in tree
if (funcall predicate item) collect item
else if (listp item) append (unknown-function predicate item)))
它遍历一棵树并创建该树中满足谓词的所有节点的平面列表。
【问题讨论】:
-
通常,您尝试执行的任务是通过组合两个不同的函数来解决的,一个是展平树,另一个是从该列表中过滤元素。在 Common Lisp 中没有 flatten 原始函数(但如果你用谷歌搜索你会发现很多定义,例如参见 this link),而对于过滤器函数,你可以使用 remove-if 或 remove-if-not (@ 987654322@).
-
flatten和remove-if-not无法生成此函数,因为谓词可以从树中选择子列表,而flatten会在谓词有机会看到之前删除所有子列表他们。
标签: lisp common-lisp