您确定特殊语法真的有帮助吗?考虑以下
(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)
少写,少读,无需额外学习,参数化微不足道。
例如,假设您想要一份与您拥有的 (in mine
) 颜色相同且重量相同或可能更重的水果列表...
(remove-if-not (lambda (x) (and (is-fruit-p x)
(eq (color x) (color mine))
(>= (weight x) (weight mine))))
objects)