鈍感で申し訳ありませんが、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。 nilClojure の 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 にアクセスした結果です。