Предположим, что у меня есть единственный элемент, и у меня есть список предикатов (функции). Я хочу применить каждый из этих предикатов к единственному элементу и получить соответствующий список возвращаемых значений. Я знаю это map
и друзья могут применить единственную функцию к каждому список аргументов, но являются там каким-либо кратким синтаксисом для применения многих функций к отдельному аргументу?
Конечно, я могу сделать
(mapcar (lambda (pred) (funcall pred SINGLE-ELEMENT)) LIST-OF-PREDICATES)
но было бы хорошо, если бы была функция, которая работала как:
(test-predicates-against-element LIST-OF-PREDICATES SINGLE-ELEMENT)
Очевидно, я могу просто defun
это, но я хотел знать, существует ли принятый метод для того, чтобы сделать это.
Эта операция встречается не так часто, и на самом деле нет предопределенного способа ее выполнения, кроме как написать ее непосредственно в Common Lisp. Разные люди любят короткий синтаксис и добавили синтаксические элементы, которые помогли бы в таком случае, во все виды Лиспа. В Common Lisp можно написать функцию, которая делает то, что вы хотите (вместо того, чтобы добавлять синтаксис).
(defun fmap (functions &rest args)
(declare (dynamic-extent args))
"Applies each function to the arguments. Returns a list of results."
(mapcar (lambda (function)
(apply function args))
functions))
CL-USER 1 > (fmap (list #'+ #'- #'* #'/) 42 17)
(59 25 714 42/17)