2009-03-28 10 views
27

Perdóneme si estoy siendo obtuso, pero estoy un poco confundido por la documentación sobre nada en Clojure. Dice:Clojure nil vs Java null?

nil tiene el mismo valor que Java null.

¿Esto significa que son la misma cosa o son diferentes de alguna manera? ¿Y una NullPointerException significa que se encontró un nulo de Java o también podría obtener esto si se encuentra nil?

Respuesta

21

De Learning Clojure

"En la mayoría de los dialectos de Lisp, hay un valor semi-equivalente a nulo de Java llamada nula. En Clojure, es simplemente nula valor nulo de Java, fin de la historia."

Como Clojure se compila en bytecode java, parece que cualquier referencia a nil es solo una referencia de objeto nulo en la JVM subyacente. Sus NPEs al ejecutar Clojure son el resultado de acceder a cero.

+0

No necesariamente. :-) También tengo una clase java en el traceback. –

39

A partir del código fuente Clojure, lang/LispReader.java:

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

De lang/RT.java:

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

Así nil es la representación de Clojure para la plataforma subyacente de null. nil no aparece en ningún otro lugar en la fuente de Java para Clojure. La única diferencia entre nil y null es que uno es Clojure y el otro es Java, pero son esencialmente alias, convertidos de ida y vuelta a la perfección según lo necesiten el lector y la impresora cuando van de Clojure a Java a Clojure.

Sí, nil puede causar NullPointerException s. Intenta llamar a cualquier método de Java en el nil, obtendrás un NPE, p.

(.tostring nil) 

El código fuente Clojure es bastante fácil de leer cuando se trata de cosas como esta, darle un aspecto.

+3

+1 para rastrearlo en el código fuente – djhaskin987