2

プロジェクトオイラーの問題に取り組んで、Clojureを学ぼうとします。私は問題7にいます。

nullpointerを取得しているのですが、いったい何を間違えたのか理解できません。

;;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)

nullpointerは、実際にはループの周りで2回目まで発生しないため(printその後にアフターを付けることで確認でき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しています。これにより、nullポインタ例外が発生します。たとえば、コードを作成する場合:

(let [x (conj x y)] (println (str (last x))))

の最後の値を出力しxます。xただし、この新しい(の結果(conj x y))のスコープはletステートメントのみであることに注意してください。実際に他の場所で使用したい場合は、たとえば、それを使用する必要がありますrecur

于 2012-06-20T16:23:33.820 に答える