Подтвердить что ты не робот

Clojure nil vs Java null?

Простите меня, если я тупой, но я немного смущен документацией о nil в Clojure. В нем говорится:

nil имеет то же значение, что и Java null.

Означает ли это, что это одно и то же, или они как-то разные? И означает ли NullPointerException, что явный null был встречен, или я также получу это, если nil встретился?

4b9b3361

Ответ 1

Из Обучение Clojure

"В большинстве диалектов Lisp есть значение, полуэквивалентное Java null, называемое nil. В Clojure nil - это просто значение Java null, конец истории."

Так как Clojure компилируется в java-байт-код, это звучит так, как любая ссылка на nil - это всего лишь ссылка на нулевой объект в базовой JVM. Ваши NPE от выполнения Clojure являются результатом доступа к nil.

Ответ 2

Из исходного кода 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");

So nil - это представление Clojure для базовой платформы null. nil больше не отображается в источнике Java для Clojure. Единственное различие между nil и null заключается в том, что один из них является Clojure, а другой - Java, но они по существу являются псевдонимами, которые конвертируются взад и вперед по мере необходимости читателем и принтером при переходе от Clojure до Java до Clojure.

Да, nil может вызвать NullPointerException s. Попробуйте вызвать любой метод Java на nil, вы получите NPE, например.

(.tostring nil)

Исходный код Clojure довольно легко читается, когда дело доходит до таких вещей, дайте ему взглянуть.