解决 Project Euler 上的问题,尝试学习 Clojure。我正在解决问题 7。
我得到了一个空指针,但我不知道我到底做错了什么。
;;By listing the first six prime numbers: 2, 3, 5, 7, 11, and 13, we can
;;see that the 6th prime is 13.
;;
;;What is the 10 001st prime number?
(defn isPrime [x]
(if-not (> x 2) false (loop [i 2]
(if (= i x)
true
(if (= (mod x i) 0) false (recur (inc i)) )
)
)
)
)
(loop [ x [2]
y 3 ]
(if (= (count x) 6)
(println (last x))
( if (isPrime y) ((let [x (conj x y)]) (println (str (last x)))) )
)
(if-not (= (count x) 10001) (recur x (inc y)) )
)
错误在于 ( if (isPrime y) ((let [x (conj x y)]) (println (str (last x)))) )
,根据 java.
这是回溯..
gcoles@gcoles-pc:~/euler$ clj 7.clj
2
Exception in thread "main" java.lang.NullPointerException
at user$eval2.invoke(7.clj:21)
at clojure.lang.Compiler.eval(Compiler.java:6511)
at clojure.lang.Compiler.load(Compiler.java:6952)
at clojure.lang.Compiler.loadFile(Compiler.java:6912)
at clojure.main$load_script.invoke(main.clj:283)
at clojure.main$script_opt.invoke(main.clj:343)
at clojure.main$main.doInvoke(main.clj:427)
at clojure.lang.RestFn.invoke(RestFn.java:408)
at clojure.lang.Var.invoke(Var.java:415)
at clojure.lang.AFn.applyToHelper(AFn.java:161)
at clojure.lang.Var.applyTo(Var.java:532)
at clojure.main.main(main.java:37)
空指针实际上直到第二次循环才出现(通过在 let
之后放置 print
来看出),所以这让我有点困惑..
有人对此有什么想法吗? 谢谢。
最佳答案
let
具有以下形式:
(let [binding values]
(body))
这将返回body
的计算结果。在上面的代码中,您的 let
表单如下所示:
(let [x (conj x y)])
注意没有尸体。因此,let
形式返回 nil
。由于它是 nil
,因此您真正调用的代码如下所示:
(nil (println (str (last x))))
因此,您实际上是在尝试将 nil
作为函数调用。这会导致您的空指针异常。例如,如果您编写代码:
(let [x (conj x y)] (println (str (last x))))
它将打印出x
的最后一个值。不过,值得注意的是,这个新的 x
((conj x y)
的结果)的作用域仅限于 let
语句。如果您确实想在其他地方使用它,则必须recur
使用它。
关于arrays - 在循环中将 conj 与数组一起使用时出现空指针错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11123340/