Краткий код на Лиспе, чтобы применить список всех функций к одному и тому же аргументу и получить список возвращаемых значений? - PullRequest
9 голосов
/ 04 августа 2010

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

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

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

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

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

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

1 Ответ

9 голосов
/ 04 августа 2010

Эта операция не очень распространена, и на самом деле нет предопределенного способа сделать это, кроме непосредственного ее написания в 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)
...