Clojure nil vs Java null?

时间:2009-03-28 00:57:06

标签: java clojure null

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

  

nil与Java null具有相同的值。

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

2 个答案:

答案 0 :(得分:43)

来自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");

所以nil是Clojure对底层平台null的表示。 nil在Clojure的Java源代码中没有显示出任何其他内容。 nilnull之间的唯一区别是一个是Clojure而另一个是Java,但它们基本上是别名,当从Clojure到Clojure时,读者和打印机根据需要无缝地来回转换Java到Clojure。

是的,nil会导致NullPointerException。尝试在nil上调用任何Java方法,你将得到一个NPE,例如

(.tostring nil)

对于像这样的事情,Clojure源代码非常容易阅读,请看一下。

答案 1 :(得分:23)

来自Learning Clojure

“在大多数Lisp方言中,有一个半值相当于Java null的值,称为nil。在Clojure中,nil只是Java的空值,故事的结尾。”

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