Вы уверены, что специальный синтаксис действительно поможет? Рассмотрим следующий
(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) ...)
. Что еще более важно, что код будет также сложнее читать (в дополнение к необходимости изучения специального нового макроса для комбинации предикатов).
ИМО может иметь смысл писать и/или комбинаторы, если вы переданы в предикаты, и вам нужно передать предикаты кому-то еще ... но не для написания кода, который вы использовали в примере; для этого я бы написать
(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)
'(DEFUN комплимент (лицо и факультативный (поток т)) (формат поток "Здравствуйте, ~ а, вы действительно великолепно смотритесь сегодня!" Человек))' – Svante