特別な構文が本当に役立つと確信していますか? 次のことを考慮してください
(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 (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)