Есть история.Посетите http://web.archive.org/web/20070808004043/http://wiki.wordaligned.org/sicp/published/FrequentlyAskedQuestions
Оригинал (не работает): http://wiki.wordaligned.org/sicp/published/FrequentlyAskedQuestions
Текст из приведенного выше FAQ (в случае поломки интернет-архива):
Почему нет?t «ноль» работает?
Быстрый ответ: ноль больше не является частью Схемы, вместо этого используйте '()
.Длинный ответ следует…
В ранних примерах в главе 2 в качестве ограничителя списка используется nil
, но когда эти примеры выполняются с использованием (например) схемы MIT, вы получаете:
;Unbound variable: nil
Аналогично, использование ()
или null
вместо nil
может работать в некоторых реализациях, но ни одна из них не является переносимой.Книга волшебников решает проблему в этой сноске
Примечательно, сколько энергии в стандартизации диалектов Лисп было рассеяно в аргументах, которые буквально ни за что: должно ли nil быть обычным именем?Должно ли значение nil быть символом?Это должен быть список?Это должна быть пара?В Схеме nil - это обычное имя, которое мы используем в этом разделе в качестве переменной, значением которой является маркер конца списка (так же, как true - это обычная переменная, которая имеет значение true).Другие диалекты Лиспа, включая Common Lisp, рассматривают ноль как специальный символ.Авторы этой книги, пережившие слишком много ссор языковой стандартизации, хотели бы избежать всей проблемы.Как только мы введем цитату в разделе 2.3, мы будем обозначать пустой список как '() и полностью исключить переменную nil.
С тех пор, как это было написано, nil был исключен из стандарта Схемы -но нижняя строка содержит: используйте '(), а не ноль.В электронном письме к списку обвиняемых Майк отмечает:
Это неприятная вещь, это бизнес с нулевым / нулевым / ().Scheme48 и scm не определяют ноль, а guile определяет его, но как процедуру, схожую с общепринятым нулем lisp (идти с его нулем, который ведет себя как ноль cl, который сам по себе отличается от '() - возможно, это как-то связано сПланы ФСФ переделать Emacs в хитрости).Я думаю, что лучше всего заменить «использование nil авторами» на «().
[Скопировано простым касанием типографской очистки для лучшего соответствия Markdown и обычного ввода ASCII на языках./ реализации, о которых идет речь.]