鈍感で申し訳ありませんが、Clojure の nil に関するドキュメントに少し混乱しています。それは言います:
nil は Java null と同じ値です。
これは、それらが同じものであることを意味しますか、それとも何らかの形で異なることを意味しますか? また、NullPointerException は、Java の null が発生したことを意味しますか、それとも 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");
基礎となるプラットフォームの に対するClojurenil
の表現も同様ですnull
。 nil
Clojure の Java ソースのどこにも表示されません。との唯一の違いはnil
、null
一方が Clojure で、もう一方が Java であることですが、これらは基本的にエイリアスであり、Clojure から Java、Clojure に移行するときに、リーダーとプリンターの必要に応じてシームレスに相互に変換されます。
ええ、 snil
を引き起こす可能性がありNullPointerException
ます。で任意の Java メソッドを呼び出してみてくださいnil
。たとえば、NPE が得られます。
(.tostring nil)
Clojure のソース コードは、このような場合に非常に読みやすくなっています。
「ほとんどの Lisp 方言には、nil と呼ばれる Java null とほぼ同等の値があります。Clojure では、nil は単に Java の null 値であり、話の終わりです。」
Clojure は Java バイトコードにコンパイルされるため、nil への参照はすべて、基礎となる JVM では単なる null オブジェクト参照のように思えます。Clojure の実行による NPE は、nil にアクセスした結果です。