2009-03-28 7 views
27

Perdonami se sono ottuso, ma sono un po 'confuso dalla documentazione su nil in Clojure. Dice:Clojure nil vs Java null?

nil ha lo stesso valore di Java null.

Questo significa che sono la stessa cosa o sono in qualche modo diversi? E una NullPointerException significa che è stato rilevato un nullo Java o lo otterrei anche se fosse stato rilevato nil?

risposta

21

Da Learning Clojure

"Nella maggior parte dei dialetti Lisp, c'è un valore semi-equivalente a Java nulla chiamato a zero. In Clojure, a zero, è semplicemente valore nullo di Java, fine della storia."

Poiché Clojure viene compilato con il codice byte java, sembra che qualsiasi riferimento a nil sia solo un riferimento di oggetto nullo nella JVM sottostante. I tuoi NPE dall'esecuzione di Clojure sono il risultato dell'accesso a zero.

+0

Non necessariamente. :-) Ho anche una classe java nel traceback. –

39

dal codice sorgente Clojure, lang/LispReader.java:

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

Da lang/RT.java:

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

Così nil è la rappresentazione di Clojure per la sottostante piattaforma null. nil non compare da nessun'altra parte nel sorgente Java di Clojure. L'unica differenza tra nil e null è che uno è Clojure e l'altro è Java, ma sono essenzialmente alias, convertiti avanti e indietro senza soluzione di continuità dal lettore e dalla stampante quando si passa da Clojure a Java a Clojure.

Sì, nil può causare NullPointerException s. Prova a chiamare qualsiasi metodo Java su nil, riceverai un NPE, ad es.

(.tostring nil) 

Il codice sorgente di Clojure è piuttosto facile da leggere quando si tratta di cose come questa, date un'occhiata.

+3

+1 per rintracciarlo nel codice sorgente – djhaskin987