我正在使用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))
Run Code Online (Sandbox Code Playgroud)
这会引发NullPointerException,我无法弄清楚原因.我可以看到可以抛出这样一个异常的代码的唯一部分是对nillify的调用,但是在抛出异常之前看起来似乎队列只有一个元素 - 即使队列是变得空虚,这就是if语句的用途.
有任何想法吗?
"给定一个向量,一个值和一个索引列表,返回一个w/everthing @ indice = value的向量"
(defn change-all [the-vector indices val]
(apply assoc the-vector (interleave indices (repeat (count indices) val))))
Run Code Online (Sandbox Code Playgroud)
"给定一个向量和一个val,返回一个向量,其中索引等于val的倍数的所有条目都是nilled,但保留原始未触及的"
(defn nillify [coll val]
(change-all coll (range (* 2 val) (inc (last coll)) val) nil))
Run Code Online (Sandbox Code Playgroud)
sexpr的问题是
(inc (last coll))
Run Code Online (Sandbox Code Playgroud)
您正在更改向量的内容,您不能再使用它来确定长度.代替:
(count coll)
Run Code Online (Sandbox Code Playgroud)
作为一种风格问题,使用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))
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
979 次 |
| 最近记录: |