【问题标题】:Standard name for function collecting subtrees satisfying a predicate?函数收集满足谓词的子树的标准名称?
【发布时间】: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@).
  • flattenremove-if-not 无法生成此函数,因为谓词可以从树中选择子列表,而 flatten 会在谓词有机会看到之前删除所有子列表他们。

标签: lisp common-lisp


【解决方案1】:

我最初的陈述是错误的,因为子列表在降级之前由谓词测试的微妙之处。在这里,为了后代:

对此没有标准名称。它只是扁平化列表列表和过滤掉不满足谓词的元素的组合。在 Common Lisp 中,没有内置的 flatten,但它是您自己的 flatten 和标准 remove-if-not 的组合。

这与subst 函数家族有更多共同点,除了叶子之外,它们还会检查子树。但是,它们正在替换树中的单个元素,而不是完全删除它们。所以 subst-ifsubst-if-not 有一些共同点,但它们仍然不是很完美的匹配。

【讨论】:

  • 不完全是。在我的未知函数中,谓词可以从树中选择子列表,但是一个通用的 flatten 函数会在 remove-if-not 有机会将它们传递给谓词之前删除所有子列表。
  • 哦,这是一个非常的好点!我认为这与 substsubst-if-not 有更多的共同点。这仍然不是一个完美的匹配,但我已经更新了我的答案。
  • 流行的图书馆里有类似的东西吗?
  • 类似什么?
  • 类似于我的问题中的unknown-function
猜你喜欢
  • 2021-03-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-18
  • 1970-01-01
相关资源
最近更新 更多