Исключение из незаконного аргумента - Clojure - PullRequest
0 голосов
/ 15 ноября 2011

У меня есть некоторый код 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 кажется излишним.

Ответы [ 3 ]

1 голос
/ 15 ноября 2011

Как ваш комментарий выше, вы можете использовать следующий код (Использовать существующий код для fun1)

(defn fun2 [v] 
        (loop [[a b c d] v] 
              (if (= a b c) 
                  [a b c d] 
              (recur [(fun1 a c) (fun1 b a) (fun1 c b) (+ d 1)]))))

Вам не нужны fun3 и fun4

1 голос
/ 15 ноября 2011

take-while работает как map, оно берет значение из коллекции за раз и проверяет предикат (то есть предикат получит один параметр).

0 голосов
/ 15 ноября 2011

Я не уверен, что вы пытаетесь сделать, но для меня (fun3 [10 10 10 1]) оценивается в [10 10 10 1]

Так как это просто старый вектор, первое, что вызывает ваша анонимная функция, это просто число 10, когда она ожидает 3 аргумента.

...