nil
не является отчетом Схемы, определяемым сегодня как привязка верхнего уровня.Если он существует в реализации, он может иметь любое значение, поэтому вы не можете зависеть от него.SICP использовал более раннюю версию Scheme, чем R4RS, и поэтому никакие современные реализации сегодня не будут полностью ее поддерживать.Я использую DrRacket , так как он поддерживает многие языки отчетов, имеет хороший отладчик и IDE, а вероятность синтаксических ошибок уменьшается из-за того, что он отступает от кода во время записи.Он имеет язык совместимости с SICP , поэтому код SICP работает без необходимости перепрыгивать через слишком много обручей.
Исторически Scheme пришла от Lisp, и Lisp не различает пустой список и значение false.Схема вводила #t
и #f
, но сохраняла тот факт, что пустой список считался ложным, пока они не изменили его, так что только #f
ложно, а все остальное считается правдивым.nil
был связыванием для ()
в ранних отчетах, поэтому, возможно, SCM изменил его на #f
, когда они сделали изменение, так как CL часто использует nil
для ложного значения и ()
для пустого списка,даже если они просто два представления одного и того же значения.
Многие реализации представляют свои собственные привязки в верхней части отчета, которому они соответствуют.Использование их фиксирует их вкус, поэтому лучше всего придерживаться стандарта кода.DrRacket интерпретирует отчеты очень строго, чем другие реализации, так что программа R6RS, написанная на DrRacket, скорее всего, будет работать без изменений в других реализациях, совместимых с R6RS.Стандарты это круто!