подайте заявку сначала списка функций в Clojure

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

(def lst '(+ -))

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

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

но по-видимому U является неправильным? Ошибка синтаксиса я принимаю. Как я делаю это?

PS:

=>(first lst)  
+

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

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

7
задан Dave Liepmann 20 October 2017 в 16:02
поделиться

1 ответ

Поскольку ваш список процитирован:

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

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

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

Правильным решением является использование списка или, что идиоматически, вектора - of functions:

(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>
13
ответ дан 6 December 2019 в 19:31
поделиться
Другие вопросы по тегам:

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