Clojure nil vs Java null?

2022-09-01 09:26:36

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

nil 与 Java null 具有相同的值。

这是否意味着它们是同一回事,或者它们在某种程度上是不同的?NullPointerException是否意味着遇到了Java null,或者如果遇到null,我也会得到这个吗?


答案 1

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

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

是的,可以引起s。尝试调用 上的任何 Java 方法,您将获得一个 NPE,例如nilNullPointerExceptionnil

(.tostring nil)

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


答案 2

学习 Clojure

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

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