Что вызывает это исключение NullPointerException? - PullRequest
4 голосов
/ 10 февраля 2011

Я использую вопросы Project Euler, чтобы помочь мне понять clojure, и я столкнулся с исключением, которое я не могу понять. nillify и change-all определены внизу для справки.

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

Есть идеи?

"с учетом вектора, значения и списка индексов, вернуть вектор w / everthing @ indice = value"

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

"учитывая вектор и значение val, вернуть вектор, в котором все записи с индексами, равными кратным значениям val, обнуляются, но оставляют исходный нетронутым"

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

1 Ответ

5 голосов
/ 10 февраля 2011

Проблема секса - это

(inc (last coll))

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

(count coll)

Для стиля используйте привязки let:

(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))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...