如果我很迟钝,请原谅我,但我对 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
可以导致NullPointerException
s。尝试调用任何 Java 方法nil
,你会得到一个 NPE,例如
(.tostring nil)
Clojure 源代码在涉及到这样的事情时非常容易阅读,请看一下。
“在大多数 Lisp 方言中,有一个值与 Java null 半等价,称为 nil。在 Clojure 中,nil 只是 Java 的 null 值,故事结束。”
由于 Clojure 编译为 java 字节码,听起来任何对 nil 的引用都只是底层 JVM 中的空对象引用。执行 Clojure 的 NPE 是访问 nil 的结果。