我必须在我编写的每个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)))
它通过树下降并创建该树中满足谓词的所有节点的平面列表。
答案 0 :(得分:0)
我原来的陈述是错误的,因为其中的子列表在它们下降之前由谓词进行测试。对于后人来说,这就是:
这没有标准名称。它只是展平列表列表并过滤掉不满足谓词的元素的组合。在Common Lisp中,没有内置的flatten,但它是你自己的 flatten 和标准 remove-if-not的组合。
这与subst函数族有一点共同之处,它们除了叶子之外还检查子树。但是,它们正在替换树中的个体元素,而不是完全删除它们。因此, subst-if 和 subst-if-not 有一些共同点,但它们仍然不是完美的匹配。