2009-03-28 16 views
27

私が鈍いのであれば許してください。しかし、私はClojureのnilに関するドキュメントでちょっと混乱しています。それは言う:Clojure nilとJava null?

nilはJavaのnullと同じ値を持っています。

これは、同じことを意味するのか、何とか違うのですか? NullPointerExceptionは、Javaのnullが検出されたことを意味しますか、またはnilに遭遇した場合にもこれを取得しますか? Learning Clojure

から

答えて

21

"ほとんどのLisp方言では、ゼロと呼ばれるJavaのnullと半同等の価値があります。Clojureのでは、nilは単にJavaのNULL値、物語の終わりです。"

ClojureはJavaバイトコードにコンパイルされるため、nilへの参照は基本となるJVMのnullオブジェクト参照にすぎません。 Clojureを実行しているNPEは、nilにアクセスした結果です。 Clojureのソースコードから

+0

必ずしもそうではありません。 :-)私はトレースバックにもJavaクラスを持っています。 –

39

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ソースにはどこにも現れません。 nilnullの唯一の違いは、1つがClojureで、もう1つがJavaだということですが、ClojureからClojureに移行するときに、リーダーとプリンタが必要に応じてシームレスに前後に変換します。

ええと、nilは、NullPointerExceptionを引き起こす可能性があります。 nilのJavaメソッドを呼び出すと、NPEが取得されます。

(.tostring nil) 

Clojureのソースコードは、このような場合には読みやすく、見てください。

+3

+1ソースコード内でそれを追跡する – djhaskin987