2011-02-10 5 views
4

私はClojureを学ぶのを助けるためにProject Eulerの質問を使用しています。私は把握できない例外に遭遇しました。 nillifyとchange-allは参照のために一番下に定義されています。このNullPointerExceptionの原因は何ですか?

(loop [the-vector (vec (range 100)) 
     queue  (list 2 3 5 7)] 
    (if queue 
     (recur (nillify the-vector (first queue)) (next queue)) 
     the-vector)) 

これはNullPointerExceptionをスローし、理由を特定できません。私が見ることができるコードの唯一の部分はは例外をスローすることができますが、nillifyの呼び出しですが、空になると、それはif文のためのものです。

アイデア?

いるすべてのベクトルを返す「、ベクターとvalを与え

(defn change-all [the-vector indices val] 
    (apply assoc the-vector (interleave indices (repeat (count indices) val)))) 

を「値= indice @ everthing/wのベクトルを返す、ベクトル値、及びインデックスのリストを与えられました」ヴァルの倍数に等しいインデックスを有するエントリnilledされているが、元の手つかずのまま」

(defn nillify [coll val] 
    (change-all coll (range (* 2 val) (inc (last coll)) val) nil)) 
+1

あなたはNPEスタックトレースを含めることができますスタイルの問題として

(count coll) 

、バインディングを聞かせて使いますか? –

+1

また、最初の行の最後に1つの仮名が残っていると思われていましたが、ループの本体はまだ乱れているようです。 –

+1

ループ内の2行目。 'queue(list(2 3 5 7))]'は 'queue(list 2 3 5 7)]'でなければなりません。しかし、それは 'ClassCastException'を投げていましたが、' NullPointerException'は投げませんでした。 – Jonas

答えて

5

問題sexprが

(inc (last coll)) 
あります

ベクトルの内容を変更していますが、これを使用して長さを決定することはできません。代わりに:

(defn change-all [the-vector indices val] 
    (let [c (count indices) 
     s (interleave indices (repeat c val))] 
    (apply assoc the-vector s))) 

(defn nillify [coll val] 
    (let [c (count coll) 
     r (range (* 2 val) c val)] 
    (change-all coll r nil))) 

(loop [the-vector (vec (range 100)) 
     [f & r] '(2 3 5 7)] 
    (if r 
    (recur (nillify the-vector f) r) 
    the-vector)) 
+1

うわー。私はそれを認識していないとは信じられません。ありがとう、トン!そして、スタイルポインタのおかげで。 – invaliduser

関連する問題