Краткий код Lisp, чтобы применить список функций все к тому же аргументу (аргументам) и получить список возвращаемых значений?

Предположим, что у меня есть единственный элемент, и у меня есть список предикатов (функции). Я хочу применить каждый из этих предикатов к единственному элементу и получить соответствующий список возвращаемых значений. Я знаю это map и друзья могут применить единственную функцию к каждому список аргументов, но являются там каким-либо кратким синтаксисом для применения многих функций к отдельному аргументу?

Конечно, я могу сделать

(mapcar (lambda (pred) (funcall pred SINGLE-ELEMENT)) LIST-OF-PREDICATES)

но было бы хорошо, если бы была функция, которая работала как:

(test-predicates-against-element LIST-OF-PREDICATES SINGLE-ELEMENT)

Очевидно, я могу просто defun это, но я хотел знать, существует ли принятый метод для того, чтобы сделать это.

9
задан Rainer Joswig 4 August 2010 в 07:34
поделиться

1 ответ

Эта операция встречается не так часто, и на самом деле нет предопределенного способа ее выполнения, кроме как написать ее непосредственно в 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)
9
ответ дан 4 December 2019 в 21:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: