Clojure ноль против Java ноль? - PullRequest
29 голосов
/ 28 марта 2009

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

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

Значит ли это, что это одно и то же или они разные? И означает ли NullPointerException, что обнаружен Java-ноль, или я также получу его, если встретился nil?

Ответы [ 2 ]

43 голосов
/ 28 марта 2009

Из исходного кода 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 больше нигде не обнаруживается в исходном коде Java для Clojure. Единственное различие между nil и null состоит в том, что одним является Clojure, а другим - Java, но они, по сути, являются псевдонимами, которые без проблем конвертируются назад и вперед по мере необходимости читателем и принтером при переходе от Clojure к Java на Clojure.

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

(.tostring nil)

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

23 голосов
/ 28 марта 2009

С Изучение Clojure

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...