Clojure nil vs Java null?

Jas*_*ker 29 java null clojure

请原谅我,如果我是钝的,但我对Clojure中有关nil的文档感到有点困惑.它说:

nil与Java null具有相同的值.

这是否意味着它们是相同的东西,或者它们是否有所不同?并且NullPointerException是否意味着遇到了Java null,或者如果遇到nil,我也会得到它吗?

Bri*_*per 44

来自Clojure源代码,lang/LispReader.java:

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

来自lang/RT.java:

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

nilClojure对底层平台的表示也是如此null. nil在Clojure的Java源代码中没有显示出其他任何地方.之间唯一的区别nilnull是一个Clojure的是,另一个是Java,但他们基本上是别名,从Clojure的打算去渣Clojure的需要时,由读写器和打印机来回转换的无缝连接.

是的,nil可以导致NullPointerExceptions.尝试调用任何Java方法nil,你会得到一个NPE,例如

(.tostring nil)
Run Code Online (Sandbox Code Playgroud)

对于像这样的事情,Clojure源代码很容易阅读,请看一看.

  • +1用于在源代码中跟踪它 (3认同)

Joh*_*ood 23

学习Clojure

"在大多数Lisp方言中,有一个值等于Java null的值,称为nil.在Clojure中,nil只是Java的空值,故事的结尾."

由于Clojure编译为java字节码,听起来像对nil的任何引用只是底层JVM中的空对象引用.您执行Clojure的NPE是访问nil的结果.