32

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

nil 与 Java null 具有相同的值。

这是否意味着它们是相同的东西,或者它们以某种方式不同?NullPointerException 是否意味着遇到了 Java null 或者如果遇到 nil 我也会得到这个?

4

2 回答 2

46

从 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");

nilClojure 对底层平台的表示也是如此nullnilClojure 的 Java 源代码中没有其他地方出现。nil和之间的唯一区别null是一个是 Clojure,另一个是 Java,但它们本质上是别名,在从 Clojure 到 Java 再到 Clojure 时,根据阅读器和打印机的需要无缝地来回转换。

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

(.tostring nil)

Clojure 源代码在涉及到这样的事情时非常容易阅读,请看一下。

于 2009-03-28T03:58:43.473 回答
25

学习 Clojure

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

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

于 2009-03-28T01:01:56.770 回答