У меня есть некоторый код Clojure, который кажется невероятно простым, но при этом выдает исключение IllegalArgumentException.Для справки, следующий код показывает 4 функции, которые я кодировал.Моя ошибка заключается в 4-м.
"Determine candy amount for first parameter. Returns even integers only (odd #'s rounded up)."
(defn fun1 [x y] (if (= (rem (+ (quot x 2) (quot y 2)) 2) 1) (+ (+ (quot x 2) (quot y 2)) 1) (+ (quot x 2) (quot y 2))))
"Play one round. Returns vector with new values."
(defn fun2 [[x y z t]] (vector (fun1 x z) (fun1 y x) (fun1 z y) (+ t 1)))
"Yield infinite sequence of turns."
(defn fun3 [[x y z t]] (if (= x y z) (vector x y z t) (iterate fun2 [x y z t])))
(defn fun4 [[x y z t]] (take-while #(not= %1 %2 %3) (fun3 [x y z t])))
Четвертая функция вызывает 3-ю функцию, пока значения xy и z не будут равны.Код компилируется правильно, но я получаю следующую последовательность в REPL:
Clojure 1.1.0
user=> (load-file "ass8.clj")
#'user/fun4
user=> (fun4 [10 10 10 1])
java.lang.IllegalArgumentException: Wrong number of args passed to: user$fun4--21$fn
(user=> (fun4 [[10 10 10 1]])
java.lang.IllegalArgumentException: Wrong number of args passed to: user$fun4--21$fn
(user=> (fun4 10 10 10 1)
java.lang.IllegalArgumentException: Wrong number of args passed to: user$fun4 (NO_SOURCE_FILE:0)
Только первое выражение действительно правильно, но я подчеркиваю, что перепробовал все возможные комбинации.Кто-нибудь может пролить свет на эту загадочную ошибку?Возможно, протестируйте его в своей собственной среде Clojure ..?
В качестве примечания, разве fun3 не должен останавливаться, когда x = y = z?Кажется, что теперь он дает бесконечную последовательность, так что if кажется излишним.