clojure – 导致此NullPointerException的原因是什么?

我正在使用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的倍数的所有条目都是nilled,但保留原始未触及的”

(defn nillify [coll val]
    (change-all coll (range (* 2 val) (inc (last coll)) val) nil))
最佳答案
sexpr的问题是

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

转载注明原文:clojure – 导致此NullPointerException的原因是什么? - 代码日志