если у меня есть список функций:
(def lst '(+ -))
и я хочу применить первый из того списка (+) к списку чисел, я думал бы
(apply (first lst) '(1 2 3 4))
но по-видимому U является неправильным? Ошибка синтаксиса я принимаю. Как я делаю это?
PS:
=>(first lst)
+
=>(apply (first lst) '(1 2 3 4))
4
оба возврата без ошибки, они просто возвращают то, что я ожидал бы в первом случае, и что я НЕ буду ожидать во втором.
Поскольку ваш список процитирован:
(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>