Если бы Lispex просто реализовывал R7RS, он был бы R7RS, и отдельное имя не имело бы смысла. Различие не в том, что Lispex добавляет, а в мета-слое, который он убирает, и в значении, которое он замораживает на месте.
Lispex заимствует словарь R7RS-small и удаляет механизм, позволяющий программе переписывать сам язык. Остаётся Lisp, который завершён, а не расширяем, и который сводится к одной канонической форме, где бы его ни читали.
Поверхность, которую нельзя расширить
Определяющая сила Scheme — макрос. define-syntax и syntax-rules позволяют
программе наращивать новый синтаксис, поэтому язык, на котором говорит файл, — это то,
что сделали из него его макросы. Lispex запрещает это начисто. Формы макросов и
расширений ридера — не медленный путь, а немедленная ошибка.
Это звучит как потеря. В этом и суть. Поскольку никакой синтаксис нельзя переопределить или добавить, любая программа на Lispex понимается полностью из одной фиксированной грамматики. Нет макроса, за которым надо гнаться, и нет диалекта, который надо учить для каждого файла. То, что вы читаете, и есть весь язык, а кто знает Lispex, тот знает каждую программу на Lispex.
Одна каноническая форма
Исходник на Lispex не разбирается по-разному от одного ридера к другому. По детерминированным правилам он нормализуется в единую каноническую форму Core, и в чтении ничто не оставлено на усмотрение реализации.
Поэтому каждый движок, выполняющий Lispex, начинает с одной и той же канонической формы для одного и того же исходника. Есть одна согласованная форма, которую читают и запускают, а не поверхность, которую каждая реализация толкует по-своему. Форма, которую нельзя свести к одному виду, — это не та форма, на которой можно строить.
Форма, а не печатный станок
В этом настоящее различие. Scheme — мета-язык, станок для печати новых языков. Lispex — единая завершённая форма. Вы её читаете и запускаете, но не переоснащаете.
Вордмарк говорит это прямо. Скобки — пунктуация, рекурсия — рифма. Стихотворение читают и декламируют, а не перестраивают в другое стихотворение при каждом открытии. Lispex относится к Lisp так же, как к тексту фиксированной формы, а не как к набору для изготовления текстов.
Грань, которая оставляет Lispex собой
Lispex продолжает расти в сторону полезных частей стандарта. Когда он обретает недостающее существенное, например обрабатываемые ошибки, проверка не в том, есть ли это в стандарте, а в том, как Lispex это добавляет. Каждая форма входит как фиксированная часть поверхности, нормализованная единственным каноническим образом, и никогда как нечто, что пользователь может переопределить.
Это ограничение и есть доказательство философии. В языке с макросами форму вроде
guard можно предоставить как синтаксис уровня библиотеки. В Lispex макросов нет,
поэтому такая форма может существовать только как фиксированная часть поверхности,
вписанная в язык, а не надстроенная над ним. Поверхность R7RS-small без её мета-слоя,
замороженная. Без макросов, без расширений, одна каноническая форма.