применить сначала из списка функций в Clojure - PullRequest
7 голосов
/ 22 июля 2010

если у меня есть список функций:

(def lst '(+ -))

и я хотел бы применить первый из этого списка (+) к списку чисел, я бы подумал, что это

(apply (first lst) '(1 2 3 4))

но, видимо, ты не прав? Синтаксическая ошибка, я предполагаю. Как мне это сделать?

PS:

=>(first lst)  
+

=>(apply (first lst) '(1 2 3 4))   
4

оба возвращают без ошибок, они просто возвращают то, что я бы ожидал в первом случае, и то, чего я НЕ ожидал во втором.

1 Ответ

13 голосов
/ 22 июля 2010

Поскольку ваш список котируется:

(def lst '(+ -))
       ; ^- quote!

его членами являются два символа , а не функции. Символ в Clojure можно использовать как функцию, но тогда он действует очень похоже на ключевое слово (то есть ищет себя в своем аргументе):

('foo {'foo 1})
; => 1

Правильное решение состоит в том, чтобы использовать список - или, идиотически, вектор - функций:

(def lst (list + -)) ; ok
; or...
(def lst `(~+ ~-))   ; very unusual in Clojure
; or...
(def lst [+ -])      ; the idiomatic solution

Тогда ваш apply пример будет работать.

Кстати, обратите внимание, что функция, напечатанная с помощью REPL, не похожа на символ, который ее называет:

user=> +
#<core$_PLUS_ clojure.core$_PLUS_@10c10de0>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...