Песочница

Грамматика чтения

Грамматика чтения определяет пробелы и комментарии, идентификаторы, булевы значения, символы, строки, числа, списки, векторы, байтовые векторы и префиксы цитирования.

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

LISPEX
(list #\a #\x41 "\x41;" #true)

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

OUTPUT
(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, а не отбрасываются тихо, как пробелы и комментарии.

Частая ошибка

Расширения считывателя, не перечисленные в профиле, отвергаются явно.

Куда дальше

Ту же грамматику как процесс чтения разбирает руководство, а код, который выдаёт отвергнутый токен, указан в каталоге.

Исходный текст, токены и чтение · Каталог ошибок и предупреждений