gpt4 book ai didi

lambda - lisp 中的 bool 仿函数

转载 作者:太空宇宙 更新时间:2023-11-03 18:37:16 25 4
gpt4 key购买 nike

我发现自己处于需要将多个谓词组合成一个的情况。有没有一种标准的方法可以做到这一点,类似于 compliment

假设有几个简单的谓词(例如 is-fruit-pis-red-pgrows-on-trees-p 等)和一个对象列表,必须使用多个谓词从中过滤出一个子集。有什么方法比以下方法更好:

(remove-if #'is-fruit-p 
(remove-if #'is-red-p
(remove-if #'grows-on-trees-p list-of-objects)))

最佳答案

您确定特殊语法真的有用吗?考虑以下内容

(lambda (x)
(and (is-fruit-p x)
(or (grows-on-tree-p x)
(is-red-p x))))

现在稍微更一般

(lambda (x)
(and (is-fruit-p x)
(or (grows-on-tree-p x)
(eq (color x) 'red))))

(lambda (x)
(and (is-fruit-p x)
(or (grows-on-tree-p x)
(eq (color x) desired-color)))) ; desired-color captured lexical

即使您为谓词建立了一个特殊的语法,您认为增加的语言复杂性是否值得您获得的刚性?例如,您是否要定义谓词 #'weights-exactly-five-ounces-p#'weights-up-to-and-including-six-and-half-ounces-p 怎么样?

如果你开始需要一个参数谓词并为此使用 lambda 形式,那么使用组合器你将编写比不使用它更多的代码,因为 (lambda (x) ...)每个参数项都需要包装器。更重要的是,代码也将更难阅读(除了必须学习用于谓词组合的特殊新宏之外)。

IMO,如果您传入谓词并且需要将谓词传递给其他人,那么编写和/或组合器可能是有意义的……但不适用于编写您在示例中使用的代码;为此我会写

(remove-if (lambda (x) (or (is-fruit-p x)
(is-red-p x)
(grows-on-trees-p x)))
list-of-objects)

写的少,读的少,不需要额外学习,参数化很简单。

例如,假设您想要一份与您拥有的(在 mine 中)颜色相同且重量相同或可能更重的水果列表...

(remove-if-not (lambda (x) (and (is-fruit-p x)
(eq (color x) (color mine))
(>= (weight x) (weight mine))))
objects)

关于lambda - lisp 中的 bool 仿函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15475769/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com