我正在使用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))
答案 0 :(得分:5)
问题sexpr
(inc (last coll))
您正在更改矢量的内容,您不能再使用它来确定长度。代替:
(count coll)
作为一种风格问题,请使用let bindings:
(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))