Нулевое значение в Mit-Scheme? - PullRequest
       96

Нулевое значение в Mit-Scheme?

23 голосов
/ 02 февраля 2012

Может кто-нибудь сказать мне, что такое представление нулевого значения в мит-схеме?В книге SICP это должно быть «ноль», но это не работает.Благодарю.

Ответы [ 4 ]

21 голосов
/ 02 февраля 2012

'() должно работать. По сути, nil в схеме - это пустой список, поэтому цитирование пустого списка дает ноль.

10 голосов
/ 20 марта 2012

Есть история.Посетите 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 на языках./ реализации, о которых идет речь.]

1 голос
/ 11 октября 2014

Я использую MIT/GNU Scheme microcode 15.3, () и '() все работает. (как вы сказали, nil и null не работают).

1 ]=> ()

;Value: ()

1 ]=> '()

;Value: ()

1 ]=> (cons 1 ())

;Value 2: (1)

1 ]=> (cons 1 '())

;Value 3: (1)
0 голосов
/ 01 апреля 2014

(список) '() и () могут представлять ноль.например,

(define (transpose mat) (accumulate-n cons () mat))

или заменить () на '() или (список).

...