2

解决 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)

空指针实际上直到第二次循环才出现(通过在print之后放置 a 看到let),所以这让我有点困惑..

有人对此有任何想法吗?谢谢。

4

1 回答 1

2

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使用它。

于 2012-06-20T16:23:33.820 回答