2011-11-15 27 views
0

私は控え目に単純だが、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は余分に見える。

答えて

1

(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

0

私はあなたが何をしようとしてはよく分からないが、私のために(fun3 [10 10 10 1])が、これは単なる古いベクトルであるので、あなたの無名関数を使用して呼び出された最初の事はちょうど数10で[10 10 10 1]

に評価それは3つの議論を期待しているとき。あなたは、コード(FUN1のための使用既存のコード)の下に使用することができます上記のあなたのコメント額面として

+0

私の反応を書いている間、私は根本的な問題が何かを理解しました。基本的には、3つの値(例えば10 10 10)が等しいときに「ゲーム」が停止するはずです。これを行うには、fun4をxyとz(fun3からの戻り値)が等しくなるまで実行するテイクオフにします。私は関数3をそれ自身で行いたいと思っていますが、非構造化ベクトル戻り値を使って条件チェックを行う方法がわかりません。 –

1

テイクしばらくはマップのように動作し、それが取ります一度にコレクションからの値を取得し、述語をチェックします(つまり、述語は1つのパラメータを取得します)。

関連する問題