2011-02-10 7 views
4

Я использую вопросы Project Euler, чтобы помочь мне изучить clojure, и я столкнулся с исключением, которое я не могу понять. 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.

Любые идеи?

«задан вектор, значение и список индексов, возвращающий вектор ж/Everthing @ Indice = значение»

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

«данный вектор и Валя, возвращает вектор, в котором все записи с индексами, равными кратный Вал является nilled, но оставить нетронутое оригинальную»

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

Вы можете включать NPE трассировки стека? –

+1

Кроме того, я исправил один предполагаемый недостающий parens в конце первой строки, но тело цикла все еще кажется перепутанным. –

+1

Вторая строка в цикле; 'queue (list (2 3 5 7))]' должен быть 'queue (список 2 3 5 7)]'. Но это использовалось для того, чтобы бросать «ClassCastException», а не «NullPointerException». – Jonas

ответ

5

проблемы sexpr является

(inc (last coll)) 

Вы меняете содержимое вектора, вы не можете использовать его для определения длины. Вместо этого:

(count 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