Песочница

Зарезервированные и запрещённые имена

Двадцать семь имён нельзя связать, а двенадцать форм нельзя использовать. Некоторых записей, привычных по другим лиспам, здесь просто нет.

Проверьте запуском

LISPEX
(define else 5)

else

Наблюдаемый результат

OUTPUT
5

else не является зарезервированным словом. Оно значимо только в голове ветви cond, case или guard, поэтому в роли имени проходит. А вот (define include 1) отвергается с кодом E120. include это обычное английское слово, которое так и просится в переменные, но оно есть в списке запрещённых форм.

Как рассуждать

  • Попытка связать зарезервированное слово даёт E110. Переименуйте переменную.
  • Запрещённая форма в позиции кода даёт E120, связываете вы её или вызываете. Цитированные данные это не код, поэтому 'include это обычный символ.
  • Записи, которые отвергает считыватель, до нормализации не доходят.
  • Некоторых записей, выученных в другом лиспе, здесь просто нет. У части из них нет даже диагностики, поэтому смотрите список ниже.

Двадцать семь имён, которые нельзя связать

Поставьте любое из них в define, в let или в список параметров, и получите E110.

ГруппаИмена
цитированиеquote quasiquote unquote unquote-splicing
ядроlambda if begin set! define
связываниеlet let* letrec
ветвлениеcond case guard and or when unless do
модулиmodule export import
значения и управлениеvalues call-with-values call/cc dynamic-wind

Четыре имени в последней строке одновременно зарезервированные слова и процедуры, поэтому на них можно ссылаться как на значения. Остальные двадцать три называют только формы, и поодиночке в позиции значения дают ошибку.

Двенадцать форм, которые нельзя использовать

ФормаЧем заменить
define-syntax syntax-rules syntax-case let-syntax letrec-syntaxпользовательских макросов нет. Решайте задачу процедурами
define-values let-values let*-valuescall-with-values
define-library include include-ci include-library-declarationsmodule и самостоятельное объединение файлов

Достаточно имени в позиции кода. Цитированных данных это не касается.

Записи, которые считыватель отвергает сразу

ЗаписьРезультат
#; комментарий к даннымE120
директива #langE120
[ ] { }E100 с отдельным сообщением

Записи, которых не существует

  • Стрелочная ветвь => у cond не поддерживается и даёт E130. У case стрелочной ветви нет даже диагностики, поэтому => читается как имя и даёт E300.
  • Список параметров в виде голого имени без скобок, как в (lambda args ...), даёт E130. Чтобы собрать аргументы, пишите (lambda (x . rest) ...) или (define (f . xs) ...).
  • Меток данных #0= и #0# нет. E100.
  • Директив считывателя, начинающихся с #!, нет. E100. Записи для объявления чего-либо в начале файла нет вовсе.
  • Префиксов системы счисления и точности #x #b #o #e #i нет. E100.
  • Символов в вертикальных чертах, вроде |a b|, нет. | это обычный знак, поэтому запись читается как два имени, |a и b|.

Частое заблуждение

E110 и E120 оба приходят из-за имён, но значат разное. E110 означает попытку перекрыть то, что есть. E120 означает обращение к тому, чего нет.

Куда дальше

Точные формы записаны в справочниках основных и производных форм, а значение каждого кода в перечне ошибок.

Основные формы · Ошибки и предупреждения