32

鈍感で申し訳ありませんが、Clojure の nil に関するドキュメントに少し混乱しています。それは言います:

nil は Java null と同じ値です。

これは、それらが同じものであることを意味しますか、それとも何らかの形で異なることを意味しますか? また、NullPointerException は、Java の null が発生したことを意味しますか、それとも nil が発生した場合にもこれを取得しますか?

4

2 に答える 2

46

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

基礎となるプラットフォームの に対するClojurenilの表現も同様ですnullnilClojure の Java ソースのどこにも表示されません。との唯一の違いはnilnull一方が Clojure で、もう一方が Java であることですが、これらは基本的にエイリアスであり、Clojure から Java、Clojure に移行するときに、リーダーとプリンターの必要に応じてシームレスに相互に変換されます。

ええ、 snilを引き起こす可能性がありNullPointerExceptionます。で任意の Java メソッドを呼び出してみてくださいnil。たとえば、NPE が得られます。

(.tostring nil)

Clojure のソース コードは、このような場合に非常に読みやすくなっています。

于 2009-03-28T03:58:43.473 に答える
25

Clojureを学ぶことから

「ほとんどの Lisp 方言には、nil と呼ばれる Java null とほぼ同等の値があります。Clojure では、nil は単に Java の null 値であり、話の終わりです。」

Clojure は Java バイトコードにコンパイルされるため、nil への参照はすべて、基礎となる JVM では単なる null オブジェクト参照のように思えます。Clojure の実行による NPE は、nil にアクセスした結果です。

于 2009-03-28T01:01:56.770 に答える