私は控え目に単純だが、IllegalArgumentExceptionをスローしているClojureコードをいくつか持っています。参考までに、以下のコードは私がコーディングしている4つの関数を示しています。私のエラーは4番目にあります。不正な引数の例外 - Clojure
"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])))
第4の関数は、値x yとzが等しくないまで第3の関数を呼び出します。コードは、私が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環境でテストしてください。
x = y = zのときfun3を停止しないでください。無限のシーケンスを与えるように見えるので、ifは余分に見える。
私の反応を書いている間、私は根本的な問題が何かを理解しました。基本的には、3つの値(例えば10 10 10)が等しいときに「ゲーム」が停止するはずです。これを行うには、fun4をxyとz(fun3からの戻り値)が等しくなるまで実行するテイクオフにします。私は関数3をそれ自身で行いたいと思っていますが、非構造化ベクトル戻り値を使って条件チェックを行う方法がわかりません。 –