Вызов функции в кон в ближайшем будущем - PullRequest
0 голосов
/ 04 апреля 2020

Я новичок ie в Clojure и немного растерялся из-за того, как вызываются функции.

Допустим, у меня есть эта функция

(defn  foo [& fns] 
   #(apply (first fns) %&))

Когда я вызываю ((foo + max min) 2 3 5 1 6 4) он вернет 21.

Когда я определю функцию следующим образом,

(defn  foo [& fns] 
   (conj [] #(apply (first fns) %&)))

Я ожидал, что ((foo + max min) 2 3 5 1 6 4) вернет [21], но вместо этого я получу

Execution error (ArityException) at user/eval2258 (REPL:1).
Wrong number of args (6) passed to: clojure.lang.PersistentVector

Почему это? И как бы это исправить?

1 Ответ

4 голосов
/ 04 апреля 2020
(defn  foo [& fns] 
   (conj [] #(apply (first fns) %&)))

Я ожидал, что ((foo + max min) 2 3 5 1 6 4) вернет [21] ...

Ваш исходный foo возвращает функцию. Теперь вы возвращаете вектор с функцией в нем. Теперь, вызывая его, вы вызываете вектор, то есть сообщение об ошибке.

user=> ([] 1 2 3)
Execution error (ArityException) at user/eval150 (REPL:1).
Wrong number of args (3) passed to: clojure.lang.PersistentVector

Чтобы исправить это, вы бы поместили результат применения в вектор, но по-прежнему возвращали функцию. Но так как вы еще не используете все, переданные в fns, не ясно, что посоветовать отсюда.

Это даст вам результат, который вы ищете:

(defn  foo [& fns] 
   #(vector (apply (first fns) %&)))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...