Текущий язык
Лиспекс предоставляет детерминированные числа, изменение лексических
связываний, правильные хвостовые вызовы, несколько значений, ошибки и guard,
одноразовое продолжение для выхода вверх, неизменяемые агрегаты, изменяемые
векторы и документированную библиотеку процедур.
Многоразовые продолжения и повторный вход, порты и общий I/O, трансцендентные функции, изменяемые пары, строки и байтовые векторы, полное Unicode-свёртывание регистра и пользовательские макросы находятся вне профиля. Наличие в другой реализации Scheme ничего не добавляет.
Реестр области
| Область | Сейчас | Отложено или исключено |
|---|---|---|
| управление | одноразовый выход вверх через call/cc, dynamic-wind, обработчики, guard | многоразовые продолжения и динамический повторный вход |
| числа | целые произвольной точности, сокращённые рациональные, конечные вещественные, точные целочисленные степень и корень | комплексные и платформенные трансцендентные функции |
| изменение | лексические ячейки и векторы | изменяемые пары, строки и байтовые векторы |
| эффекты | вывод в единственной закреплённой форме и явные границы вызова | порты, файлы, сеть, время и случайность |
| инструменты исходника | Native fmt с сохранением текста, тихая проверка, безопасная запись и делегирование редактора установленному CLI | форматирование npm/браузера, структурный перенос строк, LSP, автодополнение или диагностика |
| инструменты помощника | Native local-stdio lispex mcp serve с точным справочником, ограниченным по размеру и времени авторским запуском доверенного исходника в Rust tree, каталогом диагностики и фиксированными сводными проверками tree/Rust, Rust/Топаза или всех четырёх маршрутов | sandbox для враждебного исходника, детерминированный счётчик всей работы и логических выделений, переносимая квитанция тайм-аута, удалённый транспорт, файлы и workspace, произвольное или частичное сравнение, поиск маршрутов, запасной путь, выбор ответа, хранение исходника, MCP в npm/браузере и полномочия Ваучера |
| вычисление правил в фиксированных пределах | Native lispex embed сохраняет точный restricted component, а явный lispex embed full и второй точный component WebAssembly без imports покрывают весь lispex-profile-1.5. Оба разделяют лимиты preparation и evaluation, создают fresh instance и назначают portable core только допустимым детерминированным исходам или отказам запроса | неявный выбор full profile, переименование profile, запасной путь через tree/маршруты/MCP, host capability, удалённый транспорт, embedding в браузере/npm, pooling экземпляров, изоляция процесса, сокрытие времени/кэша/микроархитектуры, аутентификация издателя, Ваучер, защита от replay или полномочие внешнего действия |
| метапрограммирование | встроенная гигиеническая нормализация производных форм | пользовательские макросы и define-syntax |
| исполнители | Rust 205/205, LIL 205/205, LIT 84/205 | 121 неподдерживаемая строка LIT и неограниченное равенство всего языка |
| компилируемое выполнение | inspection Core IR в его единственной закреплённой форме в Native, lispex.bytecode/v1, строгий verifier, явные Rust и точная установленная VM Топаза, а в macOS ARM64 ещё и source-free correctness-first AOT-продукт через точный Топаз 5.11 и неперезаписываемая квитанция tree/Rust VM/VM Топаза/AOT. Все маршруты явные и без перехода на запасной путь | полномочия из произвольного артефакта или отчёта сравнения, скомпилированный путь Ваучера через Топаз, VM/AOT в npm и браузере, доказательство того, что две реализации значат одно и то же, прямой WebAssembly, кросс-компиляция, обещания оптимизации или стабильного соглашения о вызовах, новый синтаксис и неявные возможности |
| установка маршрута | Native проверяет переданные точные локальные каталог и stored-ZIP либо получает одну точную target из встроенного официального каталога, создавая новый lispex.route-installation/v1 без пути и закрытый корень продукта | произвольные URL или каталоги при fetch, перенаправления, повторы, регистрация, автоматический поиск или выбор, запасной путь, произвольный ZIP, заявление новой target только из упаковки или полномочия Ваучера |
| точные изображения | создание, проверка, восстановление и явный запуск PNG/ZIP общим Rust, а также ограниченный по размеру вход исходника в Ваучер | OCR, камера, допустимые преобразования, секретность, подпись, происхождение и полномочия |
| открытые идентификаторы | key-id, engine-id, source-id, input-id в Native и npm | происхождение, доверие, одобрение входа, аутентификация, свежесть и полномочия |
| политика | создание и проверка политики v1 из проверенных открытого ключа, точного хэша движка и точного исходника | закрытый ключ, автоматическая регистрация, доверие из артефакта и корректность политики |
| разрешение исходника | точный список исходников для каждого ключа в политике v1 | одобрение входа или запроса, корректность правила, защита от повторов и внешнее действие |
| переносимый вход | пакет envelope, source и input до 16 МиБ в единственной закреплённой форме, а также исходный режим | языковая возможность, новый знаменатель квитанции, свежесть или полномочия |
Текущие пределы исходника, результата, переходов, управления и времени нельзя считать детерминированным пределом всей гостевой работы или логических выделений. Маршруты tree и VM предполагают доверенный исходник правила. Тайм-аут или завершение процесса остаётся эксплуатационным прерыванием без решения и переносимой квитанции.
Почему соседние продукты не расширяют язык
Core IR и байткод разрешают и компилируют существующий
lispex-profile-1.5. Rust VM выполняет этот профиль с другой явной структурой
управления, но не добавляет синтаксис, datum, примитивы, файлы, сеть, часы или
случайность. Tree и VM разделяют Rust-значения и листья примитивов, поэтому VM
не становится новым независимым семейством.
VM Топаза это точный отдельно установленный продукт, и тот же проверенный байткод она выполняет только на явном маршруте Native macOS ARM64. Лиспекс проверяет identity продукта, запроса и результата, полноразрядные счётчики ресурсов и отсутствие запасного пути, но этот маршрут не входит в Ваучер и не доказывает независимую эквивалентность всего языка.
LIL поддерживает все 205 строк текущих возможностей, а LIT поддерживает 84 и отвергает 121. Допуск бэкенда не скрывает эти числа и не переопределяет профиль Rust. Историческая квитанция трёх семейств фиксирует лишь 59 общих совпадений на своих 144 случаях.
Сейчас LIL поддерживает всё семейство составных селекторов пар от caar до
cddddr. Буквы читаются справа налево, поэтому (caddr x) равнозначно
(car (cdr (cdr x))). Это расширяет покрытие LIL, но не сам языковой профиль.
Внутри LIL также составлены семь небольших процедур, а именно abs, square, zero?,
positive?, negative?, boolean=? и symbol=?. Они повторно используют
операции текущего профиля, не добавляя возможностей host или строк в
знаменатель языка.
Текущая граница LIL также включает предикаты конечных вещественных complex?,
rational? и real?, структурный != и семейство поиска
memv/assoc/assq/assv. Правила сравнения не смешиваются, поэтому assoc
использует структурное равенство, а остальные три поиска используют текущую
идентичность eq?/eqv?.
В LIL также доступны чувствительные к регистру порядковые сравнения, а именно
char<?, char<=?, char>?, char>=?, string<?, string<=?,
string>? и string>=?. Они раскрывают существующий порядок Unicode scalar,
не добавляя case folding или locale-aware collation.
В текущую границу LIL также входят list-copy, list-ref/nth, list-tail,
make-list, make-string, string->vector и vector->string. Копия списка
получает новый каркас пар, хвост сохраняет общую структуру с исходным списком,
значения заполнения по умолчанию детерминированы, а срезы строк и векторов
считают символы Unicode, не байты UTF-8. Это реализация существующих строк
профиля, а не новая семантика языка.
Классификация, преобразование и порядок без учёта регистра для символов и
строк также входят в текущую границу LIL через объявленное Unicode-ядро host,
и это char-ci<? и семейство string-ci<?, char-whitespace?,
char-foldcase, string-upcase, string-downcase и string-foldcase.
Для символа применяется simple mapping с одним результатом, а для строки
применяется full mapping, способный менять длину. foldcase v1 остаётся документированным
приближением через lowercase, а не полной Unicode CaseFolding. Зависимость от
ядра host не является независимой реализацией или скрытым запасным путём.
В текущую границу LIL также входят floor, ceiling, round, truncate,
exact, inexact, inexact->exact, exact->inexact, even?, odd?,
min и max. Округление сохраняет exactness, а round направляет точную
половину к ближайшему чётному. (exact 0.5) восстанавливает точное двоичное
dyadic-значение 1/2, а не разбирает десятичный текст. Предикаты чётности
требуют целое, а min и max точно сравнивают смешанную числовую башню и
возвращают inexact-результат при наличии любого inexact-входа. Проверка
аргументов и обе свёртки принадлежат LIL, а скалярная арифметика принадлежит
объявленному числовому ядру host.
LIL также реализует modulo, quotient, remainder, floor-quotient,
floor-remainder, floor/, truncate-quotient, truncate-remainder,
truncate/, gcd и lcm через точные целочисленные промежуточные значения
и опубликованное правило contagion для inexact. Семейства floor и truncate
сохраняют разные правила знака, а формы со слешем возвращают два значения.
Детерминированный expt ограничен точным целым показателем, а
exact-integer-sqrt возвращает корень и остаток. Только эти две расширенные
операции используют объявленное числовое ядро host, а общее трансцендентное
возведение в степень остаётся вне текущего языкового профиля.
LIL теперь сам выполняет все двенадцать строк процедур высшего порядка для
коллекций, а именно all?, any?, filter, fold-left, fold-right, for-each,
map, reduce, string-for-each, string-map, vector-for-each и
vector-map. Явные кадры продолжения сохраняют порядок callback, короткое
замыкание, число значений, ошибки и выходы без callback среды. Строки и
векторы копируются до обхода.
LIL также сам выполняет display, write, newline и println через
частный приёмник вывода с фиксированными пределами. Явный вывод и автопечать корневых результатов
сохраняют точный общий порядок stdout, но завершённые корневые значения
остаются отдельной проекцией квитанции. Процедуры вывода возвращают ноль
значений, а последующая ошибка не стирает уже записанные байты.
LIL также выполняет совместимые написания %, list-first и list-rest.
В новом коде предпочтительны modulo, first и rest. Только вызов
настоящего deprecated-примитива записывает W330 или W331 ровно один раз на
каждое место вызова в порядке первого появления. Перекрывающее связывание не
предупреждает, а предупреждение сохраняется, если каноническая операция затем
завершается ошибкой. Канал предупреждений отделён от stdout, значений и ошибок.
Точное изображение представляет собой обратимое представление байтов исходника, а не новый тип данных, примитив, синтаксис чтения или компилятор. При входе изображения в Ваучер меняется только способ предоставления исходника, а политика, привязка запроса, повторное выполнение и проверка допуска остаются отдельными.
Три пометки не дают смешать границы
profile-requiredпомечает все 205 возможностей текущего знаменателя языка. Фактическая поддержка каждого интерпретатора измеряется отдельно.host-adapter-onlyотносится к файлам, сети, часам, случайности, процессам и окружению. Host может сделать это вокруг вызова Лиспекса, но это не фоновая возможность гостевого языка.future-profileотносится к рассмотренным, но отсутствующим сейчас семантическим функциям, среди которых многоразовый повторный вход, гостевой ввод, трансцендентные функции, дополнительные мутации, кодеки UTF-8 и точное Unicode folding.
Это решения о границе, а не оправдание пробела реализации и не обещание будущего выпуска.
Частая ошибка
Отложенная возможность или поведение другого Scheme не становится частью Лиспекса без явного семантического решения. Настоящее изменение обязано вместе обновить спецификацию, Rust, тесты, квитанции и документацию.
Куда дальше
Точный список процедур находится в указателе, а измеренная граница каждого исполнителя описана в матрице наблюдений.