【发布时间】:2010-10-16 01:40:25
【问题描述】:
如果我很迟钝,请原谅我,但我对 Clojure 中关于 nil 的文档有点困惑。它说:
nil 与 Java null 具有相同的值。
这是否意味着它们是相同的,或者它们在某种程度上不同? NullPointerException 是否意味着遇到了 Java null 或者如果遇到 nil 我也会得到这个?
【问题讨论】:
如果我很迟钝,请原谅我,但我对 Clojure 中关于 nil 的文档有点困惑。它说:
nil 与 Java null 具有相同的值。
这是否意味着它们是相同的,或者它们在某种程度上不同? NullPointerException 是否意味着遇到了 Java null 或者如果遇到 nil 我也会得到这个?
【问题讨论】:
来自 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 源代码中没有其他地方出现。 nil 和 null 之间的唯一区别是一个是 Clojure,另一个是 Java,但它们本质上是别名,在从 Clojure 到 Java 再到 Clojure 时,根据阅读器和打印机的需要来回无缝转换。
是的,nil 可以导致NullPointerExceptions。尝试在 nil 上调用任何 Java 方法,你会得到一个 NPE,例如
(.tostring nil)
Clojure 源代码很容易阅读,当涉及到这样的事情时,看看吧。
【讨论】:
“在大多数 Lisp 方言中,有一个与 Java null 半等价的值称为 nil。在 Clojure 中,nil 只是 Java 的 null 值,故事结束。”
由于 Clojure 编译为 java 字节码,听起来任何对 nil 的引用都只是底层 JVM 中的空对象引用。您执行 Clojure 的 NPE 是访问 nil 的结果。
【讨论】: