arrays - 在循环中将 conj 与数组一起使用时出现空指针错误

标签 arrays loops clojure variable-assignment

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

相关文章:

c++ - RapidJSON/C++ : Better ways to create objects/arrays?

c# - 使用 linq 列出循环操作

Haskell迭代器: simple worked example of stripping trailing whitespace

java - Java调用Clojure函数时如何处理不同的返回类型?

clojure - 将 Clojure 的关联抽象扩展到 Java 库类型

javascript - 使用 Mocha 进行 Javascript 测试时 assert.equal 和 assert.deepEqual 之间的区别?

javascript - Nodejs中的数组内存分配

php - 将 PHP mongodb findOne 结果转换为旧的关联数组?

arrays - 单元格作为数组 Excel

java - 为什么 Clojure 不遵循 java 代码中最常见的缩进样式?