Компилятор Scheme написан на том же подмножестве Scheme, которое он компилирует. Самодостаточная сборка пересобирает себя — результат байт-идентичен исходному. Фикспойнт проверяется в CI при каждом изменении, каждый тест прогоняется через обе стадии.
Нативные объекты Wasm GC: fixnums распакованы, i31ref, пары и записи — GC-структуры. eq? — это ref.eq. Никакой теневой кучи в JavaScript — хост поставляет только два байтовых потока и ничего больше.
Гигиенические макросы: syntax-rules и процедурные syntax-case с fenders, вложенными ellipsis и datum->syntax. Они работают в интерпретаторе времени компиляции с гигиеной через переименование.
Настоящие замыкания и хвостовые вызовы: типизированные функциональные ссылки с быстрым входом per-arity и общим входом для каждого замыкания. Variadic процедуры и apply дёшевы. Каждый хвостовой вызов — return_call. Цикл из 100 миллионов итераций выполняется с постоянным стеком за ~150 мс.
call/cc и dynamic-wind: escape-продолжения реализованы через Wasm exception-handling. Захват — O(1), нормальный путь стоит один try block, winders разворачиваются от внутреннего к внешнему при выходе.
Реактивный веб-стек: (web sx) шаблоны поверх мелкозернистых сигналов (web reactive), рендерер (web html) и FFI (web js), который напрямую обращается к хосту. Эта страница построена с его помощью.
3D и WebGL: (web three) строит реактивные Three.js сцены так же, как sx строит DOM. (web gl) управляет сырым WebGL через command buffer — один вызов bridge на кадр. Шейдеры пишутся как s-выражения в (web glsl). Заголовок над статьёй сделан так: dot-matrix глифы, вершинный шейдер, один draw call.
Scheme-to-Scheme RPC без кодека: когда бэкенд тоже Scheme (Igropyr), запросы и ответы — s-выражения. (rpc "/rpc" '(add 1 2 1/2)) возвращает (ok 7/2) — точная дробь сохраняется. (web fetch) делает прямые вызовы через Wasm JSPI, (web ws) / (web sse) — потоки данных, (web json) — для остальных.
Библиотеки: R6RS-стиль (library ...) файлы с (import (math utils)), зависимости разрешаются, exports — рекомендательные, неиспользуемый код всё равно удаляется.