私が鈍いのであれば許してください。しかし、私はClojureのnilに関するドキュメントでちょっと混乱しています。それは言う:Clojure nilとJava null?
nilはJavaのnullと同じ値を持っています。
これは、同じことを意味するのか、何とか違うのですか? NullPointerExceptionは、Javaのnullが検出されたことを意味しますか、またはnilに遭遇した場合にもこれを取得しますか? Learning Clojure
から
私が鈍いのであれば許してください。しかし、私はClojureのnilに関するドキュメントでちょっと混乱しています。それは言う:Clojure nilとJava null?
nilはJavaのnullと同じ値を持っています。
これは、同じことを意味するのか、何とか違うのですか? NullPointerExceptionは、Javaのnullが検出されたことを意味しますか、またはnilに遭遇した場合にもこれを取得しますか? Learning Clojure
から
"ほとんどのLisp方言では、ゼロと呼ばれるJavaのnullと半同等の価値があります。Clojureのでは、nilは単にJavaのNULL値、物語の終わりです。"
ClojureはJavaバイトコードにコンパイルされるため、nilへの参照は基本となるJVMのnullオブジェクト参照にすぎません。 Clojureを実行しているNPEは、nilにアクセスした結果です。 Clojureのソースコードから
、lang/LispReader.java
:
static private Object interpretToken(String s) throws Exception{
if(s.equals("nil"))
{
return null;
}
lang/RT.java
から:
static public void print(Object x, Writer w) throws Exception{
{
...
if(x == null)
w.write("nil");
のでnil
は、基盤となるプラットフォームのnull
ためのClojureの表現です。 nil
は、ClojureのJavaソースにはどこにも現れません。 nil
とnull
の唯一の違いは、1つがClojureで、もう1つがJavaだということですが、ClojureからClojureに移行するときに、リーダーとプリンタが必要に応じてシームレスに前後に変換します。
ええと、nil
は、NullPointerException
を引き起こす可能性があります。 nil
のJavaメソッドを呼び出すと、NPEが取得されます。
(.tostring nil)
Clojureのソースコードは、このような場合には読みやすく、見てください。
+1ソースコード内でそれを追跡する – djhaskin987
必ずしもそうではありません。 :-)私はトレースバックにもJavaクラスを持っています。 –