2009-03-28 26 views
27

Przebacz mi, jeśli jestem tępy, ale jestem nieco zdezorientowany przez dokumentację o braku w Clojure. Jest napisane:Clojure zero vs Java null?

zero ma tę samą wartość, co Java null.

Czy to oznacza, że ​​są one tym samym lub w inny sposób się różnią? I czy NullPointerException oznacza, że ​​napotkano zerową wartość Java, czy też dostanę ją, jeśli napotkano zero?

Odpowiedz

21

Od Learning Clojure

„W większości dialektów Lisp, nie jest wartością pół-odpowiednik zerowej Java zwanego zera. W Clojure, jest po prostu zerowa wartość null Java, koniec historii.”

Ponieważ Clojure kompiluje się do kodu bajtowego java, brzmi to tak, jakby każde odniesienie do zera było po prostu odwołaniem do obiektu zerowego w podstawowej maszynie JVM. Twoje NPE od wykonania Clojure są wynikiem dostępu do zera.

+0

Niekoniecznie. :-) Mam również klasę java w tracebacku. –

39

z kodu źródłowego Clojure, lang/LispReader.java:

static private Object interpretToken(String s) throws Exception{ 
    if(s.equals("nil")) 
     { 
     return null; 
     } 

Od lang/RT.java:

static public void print(Object x, Writer w) throws Exception{ 
    { 
    ... 
    if(x == null) 
     w.write("nil"); 

Więc nil jest reprezentacja Clojure dla podstawowa platformy null. nil pojawia się nigdzie indziej w źródle Javy dla Clojure. Jedyna różnica między nil i null polega na tym, że jednym z nich jest Clojure, a drugi to Java, ale w gruncie rzeczy są to aliasy, konwertowane płynnie w zależności od potrzeb czytnika i drukarki podczas przechodzenia z Clojure na Java do Clojure.

Tak, nil może spowodować NullPointerException s. Spróbuj wywołać dowolną metodę Java na nil, otrzymasz NPE, np.

(.tostring nil) 

Kod źródłowy Clojure jest dość łatwy do odczytania, jeśli chodzi o takie rzeczy, to spójrz.

+3

+1 do śledzenia w kodzie źródłowym – djhaskin987