Clojure nil vs Java null?

Clojure nil vs Java null?

如果我很钝,请原谅我,但是我对Clojure中nil的文档有些困惑。它说:

nil has the same value as Java null.

这是否意味着它们是同一回事,还是某种程度上不同? NullPointerException是否意味着遇到了Java空值,或者如果遇到nil,我是否也会得到此值?


从Clojure源代码lang/LispReader.java

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

来自lang/RT.java

1
2
3
4
5
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到Java再到Clojure时,可以根据读者和打印机的需要无缝地来回转换。

是的,nil可能导致NullPointerException s。尝试在nil上调用任何Java方法,您将获得一个NPE,例如

1
(.tostring nil)

Clojure源代码很容易阅读,请看一下。


来自学习Clojure

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

由于Clojure编译为Java字节码,因此听起来像对nil的任何引用都只是基础JVM中的空对象引用。执行Clojure导致的NPE是访问nil的结果。