如果我迟钝了,请原谅我,但我对Clojure中有关nil的文档感到有点困惑。它说:
nil与Java null具有相同的值。
这是否意味着它们是相同的东西,或者它们是否有所不同?并且NullPointerException是否意味着遇到了Java null,或者如果遇到nil,我也会得到它吗?
答案 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源代码中没有显示出任何其他内容。 nil
和null
之间的唯一区别是一个是Clojure而另一个是Java,但它们基本上是别名,当从Clojure到Clojure时,读者和打印机根据需要无缝地来回转换Java到Clojure。
是的,nil
会导致NullPointerException
。尝试在nil
上调用任何Java方法,你将得到一个NPE,例如
(.tostring nil)
对于像这样的事情,Clojure源代码非常容易阅读,请看一下。
答案 1 :(得分:23)
“在大多数Lisp方言中,有一个半值相当于Java null的值,称为nil。在Clojure中,nil只是Java的空值,故事的结尾。”
由于Clojure编译为java字节码,听起来像对nil的任何引用只是底层JVM中的空对象引用。您执行Clojure的NPE是访问nil的结果。