Проверьте запуском
(list #\a #\x41 "\x41;" #true)Наблюдаемый результат
(a A A #t)Основная запись знака это #\ и один скаляр после него, как в #\a.
Шестнадцатеричная запись тоже допустима, и точка с запятой в ней не ставится.
Именованных знаков ровно четырнадцать, они перечислены ниже. Набор экранирующих
последовательностей строки тоже закрыт. Их шесть, \", \\, \n, \t, \r
и шестнадцатеричная \xHEX;, где точка с запятой как раз нужна. Любая другая
буква после обратной косой черты даёт E150. Привычной по другим языкам \a
здесь нет.
#true и #false это те же значения, что #t и #f.
Как рассуждать
- Целое записывается как
-?(0|[1-9][0-9]*). Рациональное состоит из целого числителя и положительного знаменателя в единственном допустимом написании, а вещественное требует дробной части или экспоненты. - Положение точки, экранирование, диапазон байтов и закрытие разделителей проверяются до нормализации.
- Шестнадцатеричный скаляр в строке записывается
\xHEX;, а знак записывается#\xHEXбез точки с запятой. - Диапазоны исходника сохраняют идентичность входа считывателя и детерминированные позиции.
- Ведущий плюс даёт имя, а не число. Там допустим только минус, поэтому
(define +5 7)спокойно проходит. - Пустая дробная часть, как в
1., даёт E100. Дробную часть или экспоненту надо действительно написать. - Скобки только
(и). Напишите[или{, и получите E100 с отдельным сообщением. - Точка означает точечную пару только тогда, когда за ней идёт разделитель,
поэтому
...и.fooэто обычные имена. В векторе точка не допускается вовсе, поэтому#(1 . 2)даёт E100. - Элементы байтового вектора это целые от 0 до 255, записанные буквально. Даже
#u8(4/2), которое вычислилось бы в 2, отвергается.
Закреплённая грамматика токенов
| Токен | Допустимая форма | Граница отказа |
|---|---|---|
| целое | -?(0|[1-9][0-9]*) | ведущий ноль, префикс основания или точности |
| рациональное | <целое>/[1-9][0-9]*, сокращается после чтения | нулевой/отрицательный знаменатель, ведущий ноль |
| вещественное | десятичное с дробью и/или экспонентой | неоднозначное целое, не конечный литерал |
| строка | UTF-8 в кавычках с закреплёнными escape, включая \xHEX; | незавершённый escape или пропущенная шестнадцатеричная точка с запятой |
| знак | #\<скаляр>, #\xHEX или закреплённое имя | неверный скаляр или точка с запятой после шестнадцатеричного знака |
| байтовый вектор | #u8(<байт> ...) | элемент вне 0..255 |
Именами знаков служат ровно space, newline, linefeed, tab, return,
null, nul, delete, rubout, escape, esc, backspace, alarm и
page. Строчный комментарий начинается с ;, блочный #| ... |# может
быть вложенным. Комментарий datum #; и директива #lang отвергаются с
E120, а не отбрасываются тихо, как пробелы и комментарии.
Частая ошибка
Расширения считывателя, не перечисленные в профиле, отвергаются явно.
Куда дальше
Ту же грамматику как процесс чтения разбирает руководство, а код, который выдаёт отвергнутый токен, указан в каталоге.
Исходный текст, токены и чтение · Каталог ошибок и предупреждений