Песочница

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

Проверьте допустимость имён, формы с кодом E120 и ошибки записи, возникающие до вычисления.

Эта страница поможет выбрать имя переменной или параметра и понять коды E110 и E120. Проверки имён нормализатором отделены от ошибок записи, которые обнаруживает считыватель.

Используйте обычное имя

Вставьте эту программу целиком в песочницу.

LISPEX
(define else 5)

else

Результат

ВЫВОД
5

else можно использовать как обычное имя. Особое значение оно имеет в начале ветви cond, case или guard. Там оно обозначает ветвь, которая выполняется, если ни одна предыдущая не подошла.

Сравните эти отдельные примеры:

Исходный текстРезультат или код диагностикиПричина
(define if 5)E110if зарезервировано, связывать его нельзя
ifE110if обозначает форму, а не значение-процедуру
(define include 1)E120include запрещено в коде
'includeincludeцитированные данные могут содержать этот символ

Нормализатор проверяет эти имена до вычисления. Он также проверяет структуру выражений и преобразует сокращения в основные формы.

27 зарезервированных имён

Связывание задаёт значение имени, например в 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

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

12 запрещённых форм

Эти имена дают E120 в коде: при обращении к имени, связывании или вызове. В цитированных данных они остаются обычными символами.

ФормыКак выразить задачу
define-syntax syntax-rules syntax-case let-syntax letrec-syntaxиспользуйте процедуры для повторяемых вычислений; пользовательские макросы не поддерживаются
define-values let-values let*-valuesиспользуйте call-with-values
define-library include include-ci include-library-declarationsиспользуйте module и объединяйте исходные файлы самостоятельно

E120 обозначает запрещённую форму или расширение считывателя из списка. Обычное неопределённое имя, например alpha, при вычислении даёт E300.

Ошибки записи при чтении

Считыватель сообщает об этих ошибках до нормализации. Допустимые записи приведены в грамматике чтения.

ЗаписьКод диагностики
#;, комментарий к даннымE120
директива #langE120
квадратные или фигурные скобкиE100
метки данных вроде #0= и #0#E100
директивы считывателя, начинающиеся с #!E100
префиксы основания или точности #x #b #o #e #iE100

Для пояснений в исходном тексте используйте строчные или блочные комментарии. Строка, начинающаяся с ;!, тоже является обычным комментарием.

Вертикальная черта — обычный знак в имени. Поэтому |a b| читается как два имени, |a и b|. Такая запись не цитирует один символ с пробелом внутри.

Ошибки форм и поиск обычных имён

Нормализатор отклоняет стрелочную ветвь cond с =>, выдавая E130. В теле ветви case запись => читается как обычное имя. Если эта ветвь выполняется, а имя не определено, возникает E300. Определение => задаёт его значение, но не добавляет поведение стрелочной ветви.

Одиночное имя вместо списка параметров, как в (lambda args args), даёт E130. Для сбора остальных аргументов используйте список параметров с точкой:

LISPEX
((lambda (x . rest) rest) 1 2 3)

Результат

ВЫВОД
(2 3)

Процедура связывает x со значением 1, а rest — со списком (2 3). Определение (define (f . xs) xs) собирает все аргументы.

Базовые формы синтаксиса · Синтаксис, который раскрывается в базовые формы · Ошибки и предупреждения