Clojure nil vs Java null?
Простите меня, если я тупой, но я немного смущен документацией о nil в Clojure. В нем говорится:
nil имеет то же значение, что и Java null.
Означает ли это, что это одно и то же, или они как-то разные? И означает ли NullPointerException, что явный null был встречен, или я также получу это, если nil встретился?
Ответы
Ответ 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 довольно легко читается, когда дело доходит до таких вещей, дайте ему взглянуть.