Почему эта функция не работает должным образом? - PullRequest
1 голос
/ 06 марта 2012

Почему эта функция не работает должным образом?

(defn my-juxt
  [& fns]
  (if (= 1 (count fns))
    (fn [& a] (list (apply (first fns) a)))
    (fn [& a]
      (cons (apply (first fns) a) ((my-juxt (rest fns)) a)))))

Примечание: это работает -

(defn new-juxt
  [& fns]
  (fn [& a]
    (map #(apply % a) fns)))

1 Ответ

6 голосов
/ 06 марта 2012

Проблема в том, как используются varargs. my-juxt имеет параметры [& fns], в то время как ему дано [fns] в последней строке. То же самое относится и к функции, которую она возвращает в результате: она ожидает [& a] при условии [a].

Код ниже будет работать (обратите внимание на два дополнительных apply там)

(defn my-juxt
  [& fns]
  (if (= 1 (count fns))
    (fn [& a] (list (apply (first fns) a)))
    (fn [& a]
      (cons (apply (first fns) a) 
            (apply (apply my-juxt (rest fns)) a)))))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...