Эта страница поможет выбрать имя переменной или параметра и понять коды E110 и E120. Проверки имён нормализатором отделены от ошибок записи, которые обнаруживает считыватель.
Используйте обычное имя
Вставьте эту программу целиком в песочницу.
(define else 5)
elseРезультат
5else можно использовать как обычное имя. Особое значение оно имеет в начале ветви cond, case или guard. Там оно обозначает ветвь, которая выполняется, если ни одна предыдущая не подошла.
Сравните эти отдельные примеры:
| Исходный текст | Результат или код диагностики | Причина |
|---|---|---|
(define if 5) | E110 | if зарезервировано, связывать его нельзя |
if | E110 | if обозначает форму, а не значение-процедуру |
(define include 1) | E120 | include запрещено в коде |
'include | include | цитированные данные могут содержать этот символ |
Нормализатор проверяет эти имена до вычисления. Он также проверяет структуру выражений и преобразует сокращения в основные формы.
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 |
директива #lang | E120 |
| квадратные или фигурные скобки | E100 |
метки данных вроде #0= и #0# | E100 |
директивы считывателя, начинающиеся с #! | E100 |
префиксы основания или точности #x #b #o #e #i | E100 |
Для пояснений в исходном тексте используйте строчные или блочные комментарии. Строка, начинающаяся с ;!, тоже является обычным комментарием.
Вертикальная черта — обычный знак в имени. Поэтому |a b| читается как два имени, |a и b|. Такая запись не цитирует один символ с пробелом внутри.
Ошибки форм и поиск обычных имён
Нормализатор отклоняет стрелочную ветвь cond с =>, выдавая E130. В теле ветви case запись => читается как обычное имя. Если эта ветвь выполняется, а имя не определено, возникает E300. Определение => задаёт его значение, но не добавляет поведение стрелочной ветви.
Одиночное имя вместо списка параметров, как в (lambda args args), даёт E130. Для сбора остальных аргументов используйте список параметров с точкой:
((lambda (x . rest) rest) 1 2 3)Результат
(2 3)Процедура связывает x со значением 1, а rest — со списком (2 3). Определение (define (f . xs) xs) собирает все аргументы.
Базовые формы синтаксиса · Синтаксис, который раскрывается в базовые формы · Ошибки и предупреждения