Проверьте запуском
(define else 5)
elseНаблюдаемый результат
5else не является зарезервированным словом. Оно значимо только в голове ветви 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*-values | call-with-values |
| define-library include include-ci include-library-declarations | module и самостоятельное объединение файлов |
Достаточно имени в позиции кода. Цитированных данных это не касается.
Записи, которые считыватель отвергает сразу
| Запись | Результат |
|---|---|
#; комментарий к данным | E120 |
директива #lang | E120 |
[ ] { } | 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 означает обращение к тому, чего нет.
Куда дальше
Точные формы записаны в справочниках основных и производных форм, а значение каждого кода в перечне ошибок.