Три семейства
- Rust — операционный эталон языка с 205 из 205 отслеживаемых строк примитивных возможностей. Native, npm, открытый WASM и Песочница — разные поверхности поставки одной реализации.
- LIL — интерпретатор, написанный на самом Лиспексе. Он поддерживает все 205 строк текущих примитивных возможностей.
- LIT — транслитерация интерпретатора на Топаз. Она отдельно поддерживает 84 из 205 строк и отвергает 121. Независимость исходного кода не заявляется.
Вычислитель использует явные исходы, сигналы и трамплин вместо раскрутки исключений среды. После точного восстановления изображения обычные чтение и вычисление не меняются; выбор LIL или LIT остаётся обычным выбором интерпретатора.
Требование языка и поддержка интерпретатора — не одно и то же
Текущий контракт языка содержит 205 обязательных строк возможностей. Все они
имеют нормативную пометку profile-required. Она описывает цель полного
интерпретатора, а не выдаёт частичную реализацию за готовую.
| Семейство | Поддерживается сейчас | За границей поддержки |
|---|---|---|
| эталон Rust | 205/205 | весь текущий профиль |
| LIL | 205/205 | весь текущий знаменатель возможностей |
| LIT | 84/205 | остальные 121 строка отвергается явно |
Форматирование исходника — инструмент Native
lispex fmt, fmt --check и fmt --write доступны в Native CLI.
Расширение VS Code/Open VSX передаёт Format Document установленному бинарнику.
npm, публичный WASM и Песочница форматирование не предоставляют, а расширение
не скрывает отсутствие Native через fallback. Форматтер меняет только
пробельное окружение исходника; это не вычислитель, семейство бэкенда,
семантический профиль или источник evidence.
Core IR, байткод и семейство бэкенда — разные оси
Native может понизить весь текущий нормализованный профиль в канонический
lispex.core-ir/v1, строго проверить эти байты и показать разрешённые ячейки,
захваты, хвостовые позиции, requirements, координаты исходника и
идентификаторы. Команды core-ir build, validate и inspect всегда
указывают, что выполнение не производилось, а граница равна
integrity-only.
Затем Native компилирует строгий Core IR в канонический
lispex.bytecode/v1, проверяет бинарный артефакт до создания состояния и
исполняет его в lispex-rust-vm/v1. VM непосредственно охватывает текущий
профиль: все 205 строк примитивов и 18 строк с вызовом гостевых процедур.
Стандартным Rust-движком остаётся tree; --engine vm выбирается явно и не
имеет fallback.
Native macOS ARM64 может передать те же проверенные байты точному отдельно
установленному lispex-topaz-vm/v1. У маршрута собственные reader, verifier
и машина явного управления на Topaz. Допускается только фиксированный продукт
Topaz 5.11 с закрытыми request/result, полным счётчиком u64, ограниченным
запуском и пятью нулевыми fallback. compare-vms записывает обе VM, не делая
Topaz стандартным движком или движком Vouch.
В Native для macOS ARM64 можно также сгенерировать читаемый статический граф
Topaz, скомпилировать его только точной установленной цепочкой Topaz 5.11 и
установить закрытый AOT-продукт без исходников. aot inspect и validate
ничего не выполняют, а aot run ничего не компилирует. Продукт, source map,
артефакт, исполняемый файл, вход, полноразрядные ресурсы u64, наблюдения и
пять нулевых fallback связаны; маршрут исключён из всех конструкторов Vouch.
compare-routes помещает эти явные маршруты в один суд, не смешивая identity.
Он один раз выводит исходник, Core IR и байткод, проверяет соответствие AOT,
затем без повторов запускает tree, Rust VM, Topaz VM и AOT.
Неперезаписываемая квитанция сравнивает семантику и только действительно
сопоставимые ресурсы; отсутствующие у tree счётчики остаются отсутствующими.
Это локальная диагностика, а не новое семейство бэкенда или вход Vouch.
| Поверхность | Core IR | Байткод и VM | Compiled Vouch |
|---|---|---|---|
| Native | build, строгий validate, inspect | встроенная Rust VM на всех платформах; точная Topaz VM, source-free AOT build/inspect/validate/run и явный суд четырёх маршрутов на macOS ARM64 | build/inspect/validate .lpxvca, tree/Meaning/Rust-VM re-execution и gate; Topaz VM, AOT и квитанция сравнения исключены |
| npm CLI | нет reader и команд | нет reader, verifier и VM | нет команды, флага или повышения отчёта |
| открытый WASM | нет API Core IR | нет API байткода и VM | нет API |
| Песочница | нет импорта и inspection Core IR | нет импорта байткода и VM | нет UI или API |
Core IR — невыполняемый материал смысла, а проверенный байткод — исполняемый артефакт VM. Tree и Rust VM разделяют значения и листья примитивов. Исходник Topaz VM структурно отделён, но скомпилирован Topaz Rust Stage 0, поэтому линия VM указывается явно и не увеличивает молча число семейств исторической квитанции. Там остаются Rust, LIL и LIT. Meaning Graph остаётся отдельным путём проверяемого подмножества.
Compiled Vouch не добавляет семейство бэкенда. Только специальный контейнер, точно заново выведенный из закреплённого потребителем исходника после аутентификации, допускается к сравнению с текущей Rust VM. Обычный байткод и отчёты остаются вне пути полномочий.
Явный выбор LIL или LIT строг: неподдерживаемая операция не передаётся скрыто в Rust или удобную функцию host. Поэтому частичные интерпретаторы полезны для проверки, но не маскируются под полные.
LIL сам выполняет всё семейство составных селекторов пар от caar до
cddddr. Например, (caddr x) равнозначно (car (cdr (cdr x))).
Композиция вычисляется внутри LIL, а не передаётся callback-функции host.
LIL также составляет abs, square, три предиката знака/нуля и типизированные
boolean=? и symbol=? из уже допущенных числовых, сравнительных и типовых
операций. Например, (abs -3/2) возвращает 3/2, а
(boolean=? #t #t #f) — #f. Проверка операндов и ошибки совпадают с
эталоном Rust.
В текущем профиле конечных вещественных чисел complex?, rational? и
real? сводятся к общему вопросу number? для любого значения. LIL также
сам выполняет структурный !=, основанный на eqv поиск memv, структурный
assoc и основанные на eqv assq/assv. Например,
(memv 2 '(1 2 3)) возвращает хвост (2 3), а
(assoc '(a b) '(((a b) . ok))) — найденную пару.
LIL реализует char<?, char<=?, char>?, char>=? по Unicode scalar
value, а string<?, string<=?, string>?, string>=? —
лексикографически по этим значениям. Поэтому (char<? #\a #\b) и
(string<? "a" "aa" "b") истинны. Это детерминированный порядок code point,
а не locale collation, нормализация или сравнение без учёта регистра.
LIL также сам выполняет повседневную навигацию по агрегатам и преобразования.
list-copy создаёт новый неглубокий каркас пар, list-ref и nth выбирают
элемент, а list-tail возвращает хвост с общей структурой. make-list по
умолчанию заполняет список значением 0, а make-string — пробелом.
Диапазоны string->vector и vector->string считаются в символах, а не в
байтах, поэтому (vector->string (string->vector "aλ🙂")) возвращает тот же
текст. Полученный вектор новый и изменяемый.
Операции регистра Unicode используют явно записанное ядро символов и строк
host. Оно покрывает char-ci<? и остальные сравнения char-ci,
char-lower-case?, char-upper-case?, char-whitespace?, char-upcase,
char-downcase, char-foldcase, string-ci<? и остальные порядковые
сравнения string-ci, string-upcase, string-downcase и
string-foldcase. Преобразование символа применяет simple mapping и возвращает один
символ; строка использует full mapping и может изменить длину, например
(string-upcase "Straße") даёт "STRASSE". Сравнение без учёта регистра
сначала проверяет всю цепочку. В текущем профиле foldcase — это приближение
через lowercase: simple для символов и full для строк, а не полная таблица
Unicode CaseFolding. Locale collation и нормализация не выполняются.
В LIL также доступны повседневные скалярные числовые операции. floor,
ceiling и truncate округляют в указанном направлении, а round отправляет
точную половину к ближайшему чётному целому. Exactness входа сохраняется:
(floor 1.8) даёт 1.0, а (floor 9/5) — 1. exact и
inexact->exact восстанавливают точное двоичное значение конечного inexact
числа, поэтому (exact 0.5) даёт точное dyadic-значение 1/2, а не результат
разбора десятичного текста. inexact и exact->inexact выполняют обратное
преобразование. even? и odd? требуют целое. min и max точно сравнивают
смешанные exact/inexact значения, при равенстве сохраняют первый операнд и
возвращают inexact-результат, если хотя бы один вход был inexact. Проверка
аргументов и свёртки min/max принадлежат LIL; округление, преобразование
exactness и чётность используют явно записанное числовое ядро host, а не
скрытый fallback или независимую реализацию.
Семейство точных целочисленных операций не переводит смешанную пару целых в
binary64 до вычисления результата. quotient/remainder усекают к нулю, а
floor-quotient/floor-remainder округляют к минус бесконечности. Поэтому
(remainder -7 3) даёт -1, а (modulo -7 3) — 2. floor/ и
truncate-quotient/truncate-remainder явно выбирают два компонента
усечённого деления, а floor/ и truncate/ возвращают частное и остаток как
два значения:
(call-with-values (lambda () (floor/ -7 3)) list) даёт (-3 2).
gcd и lcm — неотрицательные вариативные свёртки с единицами 0 и 1;
любой inexact-операнд делает итог inexact. expt разрешает только точный
целый показатель, поэтому общее трансцендентное возведение в степень остаётся
вне профиля. exact-integer-sqrt возвращает нижний корень и остаток как два
точных значения. Деление и евклидовы свёртки написаны на Лиспексе; только
expt и exact-integer-sqrt используют объявленное расширенное числовое
ядро host.
Поверхность процедур высшего порядка для коллекций теперь полностью доступна
в LIL. all? и any? используют строгий boolean и короткое замыкание;
map, filter, reduce, fold-left и fold-right требуют ровно одно
значение callback. for-each, string-for-each и vector-for-each
отбрасывают любое число значений и возвращают ноль. string-map и
vector-map сохраняют вид коллекции. Строки и векторы копируются до первого
вызова. Каждый callback проходит через гостевой кадр продолжения, поэтому
обработчики, одноразовые выходы и учёт ресурсов остаются в машине LIL, а не в
callback среды.
Четыре процедуры вывода LIL — display, write, newline и println —
используют те же канонические гостевые renderer и ограниченный private effect
sink. Явный вывод и автопечать CLI сохраняют общий порядок stdout, но проекция
корневых значений записывается отдельно, поэтому произвольный текст display
нельзя принять за результат. Вывод не попадает в stdout host, а последующая
ошибка не стирает уже записанные байты.
Три устаревающих совместимых имени реализованы без расширения профиля. %
передаёт работу modulo, а list-first и list-rest — car и cdr.
LIL записывает W330/W331 так же, как Rust: один раз на место вызова, в порядке
первого появления. Перекрытое имя не предупреждает; предупреждение сохраняется
и при последующей ошибке канонической операции. Этот упорядоченный канал
отделён от stdout, значений и диагностики ошибки.
Что обязан объявить исполнитель
| Поле | Требование | Закрытый отказ |
|---|---|---|
| вид | интерпретатор | компилятор или неизвестный вид отвергается |
| вызов | версионированные команда и протокол | неверная форма, дубликат, лишнее поле или дрейф версии |
| артефакт | точные бинарник, WASM и связующий код названы | запись не совпадает с выполненным продуктом |
| происхождение | явно указано общее или внешнее происхождение | скрытое повышение до независимого свидетеля |
| ресурсы | именованные пределы и отчётность | заявление общего порога без измерения |
| поверхность | точные корпус, семейство и маршрут среды | расширение ограниченного результата до всего языка |
Общая историческая квитанция связывает каждый из 144 случаев с выполненным продуктом Rust, LIL и LIT, его пределами, наблюдениями и происхождением. Она не допускает неизвестный исполнитель автоматически.
Возможности продукта не равны
Native предоставляет полный путь Vouch: идентификаторы, политику, выдачу, аутентификацию, повторное выполнение, локальный gate и явное согласие VM с артефактом из точного исходника. npm использует общий Rust для идентификаторов, политики и аутентификации, но не читает compiled artifact, не выдаёт и не применяет решение. WASM и Песочница выполняют Лиспекс и работают с точными изображениями без инструментов доверия Vouch.
Частая ошибка
Сгенерированный Rust, Python, веб-маршрут или другая упаковка одного исходника не становится новой реализацией. Четыре маршрута LIT могут подтвердить согласие поставки на своей поверхности, но не являются четырьмя свидетелями.
Куда дальше
Матрица показывает точные числа наблюдений, а выбор среды помогает подобрать поверхность для приложения.