(Лиспекс)

Руководство Lispex


(Лиспекс)

( скобки как пунктуация, рекурсия как рифма )

Небольшой Лисп для решающих правил, сознательно близкий к Scheme. Один и тот же ввод даёт один и тот же ответ, а запуск может оставить запись, достаточно точную для последующей проверки.

Таблица I

На входе — структурированные данные, на выходе — печатаемый вердикт.

Записи — ассоциативные списки, граница — точное целочисленное сравнение, а каждый вердикт, включая отказ, — обычные данные, которые можно напечатать и сравнить. Новой нотации здесь нет: поверхность принадлежит Scheme. Характер Lispex — в том, что зафиксировано: закрытая поверхность процедур, детерминированные ошибки, один ответ на один ввод.

LISPEX
(define (field key record)
  (let ((entry (assq key record)))
    (if (pair? entry)
        (cdr entry)
        (error "missing field" key))))

(define (review-refund request)
  (let ((days   (field 'days request))
        (opened (field 'opened request))
        (cents  (field 'cents request)))
    (cond ((not (exact-integer? days)) '(reject malformed-days))
          ((>= days 15)                '(deny outside-window))
          (opened                      '(deny opened-item))
          ((> cents 50000)             '(escalate manual-review))
          (else                        '(allow within-policy)))))

(map review-refund
     '(((days . 14) (opened . #f) (cents . 12900))
       ((days . 14) (opened . #f) (cents . 82000))
       ((days . 15) (opened . #f) (cents . 12900))))
; => ((allow within-policy)
;     (escalate manual-review)
;     (deny outside-window))
С чего начать

Два входа: карта синтаксиса для читающих Scheme и пошаговый путь для остальных.

Карта синтаксиса показывает все повседневные формы с наблюдаемыми результатами и отмечает, где Lispex строже привычного Scheme: обязательная ветвь else у if, закрытая поверхность из 205 процедур, higher-order процедуры с одним списком, отсутствие слоя пользовательских макросов. Путь обучения идёт медленнее и завершается одним законченным, проверенным правилом возврата.

  1. 01Запустить первую программу
  2. 02Назвать значения и процедуры
  3. 03Выбрать решение в форме данных
  4. 04Проверить законченное правило возврата

Lispex работает без сервера. Эталонный интерпретатор, скомпилированный в WebAssembly, выполняет код прямо в вашем браузере.

Среды выполнения Lispex

Один простой путь по умолчанию и четыре явных Native-маршрута.

По умолчанию везде — в браузере, npm и Native — работает интерпретатор Rust tree. Native дополнительно позволяет проверить и закрепить встроенную Rust VM либо точно установленные продукты Topaz VM и AOT — как явные маршруты, а не тихие подмены.

Rust и LIL покрывают все 205/205 текущих строк возможностей; LIT отдельно ограничен 84/205 и именно так и отражается. Native-команды routes inventory, lock, doctor, measure и run держат точную identity маршрута и отказ на виду. Ничто не обнаруживается, не подменяется и не повторяется без вашего ведома: отсутствующий продукт — это явный отказ, а не fallback.

Выбрать среду выполнения
Один ограниченный запуск, одна сохранённая запись

Выполните правило возврата в точных лимитах и сохраните предмет проверки.

Native-команда lispex rule run готовит проверенное правило, принимает один строгий JSON-ввод и один раз вычисляет его на ограниченном вычислителе — отдельном движке без импортов, который обязан отчитаться за каждую единицу работы и выделения внутри объявленных вами лимитов. После запуска остаётся каталог решения из пяти членов: подготовленный артефакт правила, канонический ввод, детерминированный результат с точной привязкой запроса, пригодное к выдаче переносимое ядро и производная сводка. Исходного текста правила среди них сознательно нет.

  1. 01Проверенное правило
  2. 02Строгий JSON-ввод
  3. 03Решение: allow
  4. 04Проверяемое переносимое ядро

1. Правило

LISPEX
(let ((days (cdr (car input)))
      (opened (cdr (car (cdr input)))))
  (if (< days 15)
      (if opened "deny" "allow")
      "deny"))

2. Ввод

JSON
{
  "days": 14,
  "opened": false
}

3. Один ограниченный запуск

SHELL
lispex rule run \
  --source refund-window.lspx \
  --input day-14-unopened.json \
  --prepare-limits prepare-limits.json \
  --eval-limits evaluation-limits.json \
  --out decision

lispex rule inspect --dir decision
lispex rule verify --dir decision
lispex rule replay --dir decision
4. Решение

Для поддерживаемого случая «14-й день, не открыт» ограниченный запуск возвращает allow.

5. Запись, проверенная тремя способами

rule inspect сводит каталог без выполнения; rule verify — тоже без выполнения — проверяет точный набор членов, identity, хеши и привязки; rule replay один раз вычисляет записанный запрос в свежем экземпляре вычислителя и требует того же результата. Ни одна из трёх операций не даёт полномочий.

Что связывает переносимое ядро

Смысловое правило, канонический ввод, точные лимиты, точный артефакт вычислителя и детерминированный результат — достаточно, чтобы точно знать, на какой вопрос и под какими потолками был дан ответ. Израсходованный или оставшийся ресурс в ядро не входит.

Чего запись не устанавливает

Кто выполнил запуск, свежо ли решение, справедлива и корректна ли политика в правиле, не использовано ли то же решение дважды — и никакого разрешения действовать за пределами процесса.

Пройти полный путь решения
Точные изображения Lispex

Решающее правило можно передать как детерминированное изображение.

Изображение — это канонический графический файл, несущий точные байты исходника правила. Здесь оно несёт проверенное правило возврата, возвращающее каноническое Decision — единственную форму результата, для которой Vouch может выпустить свидетельство. Исходник можно восстановить локально, выполнить только после доказательства каноничности байтов или закрепить доказанное изображение как точный source в процессе Vouch ниже. Пиксели несут только целостность.

Каноническое изображение Lispex с правилом окна возврата, возвращающим Decision
LISPEX
(define days-since-delivery (car input))
(define opened? (car (cdr input)))

(if (<= days-since-delivery 14)
    (if opened?
        (decision-deny)
        (decision-approve))
    (decision-deny))

Отсюда один путь продолжается ниже: восстановить и доказать это изображение, закрепить его как точный source и в Native выпустить подписанное свидетельство Vouch для одного точного ввода. Получатель аутентифицирует это свидетельство по собственной trust policy, заново выполняет правило на своей машине и проходит локальный gate — а действовать ли дальше, отдельно решает внешнее приложение. Само изображение — ничто из этого: не подписанное свидетельство, не доверие и не полномочие. Оно лишь точно переносит байты.

Lispex Vouch

У решения может быть квитанция.

Vouch превращает одно записанное решение в подписанное переносимое свидетельство — и строго отделяет свидетельство от разрешения.

Квитанция — это подписанная запись одного запуска: какие байты правила выполнялись, какие байты ввода вошли и какое решение получилось. В нативном release-бинарнике lispex vouch issue создаёт её, сам выполняя проверенное правило — квитанция фиксирует то, что действительно произошло, а не чьи-то слова. Квитанция, исходник и ввод могут путешествовать одним файлом — bundle. Аутентифицировать bundle может любой — командой lispex vouch verify в Native или npm, — и она отвечает ровно на один вопрос: подписал ли выбранный вами ключ именно эти байты? Больше она сознательно не отвечает ни на что.

Подробнее о Lispex Vouch
Request-bound Vouch

Bundle не выбирает запрос, выполняемый вашим gate.

Повторное выполнение начинается с запроса, закреплённого вами, а не со слов bundle.

Привязка запроса — правило, по которому ваша машина повторно выполняет только то, что вы сами попросили. Bundle доказывает то, что наблюдал его издатель; он не выбирает правило и ввод на вашей стороне. Поэтому перед любым повторным выполнением вы сами закрепляете запрос: исходник правила — файл у вас на руках или изображение, прошедшее полное каноническое доказательство, — и точный ввод. Проверка сначала аутентифицирует подпись, затем сравнивает bundle с закреплённым запросом, и только точное совпадение переходит к выполнению. Не закрепите ничего — проверка останется проверкой подписи и никогда не дойдёт до повторного выполнения или gate.

Проверка, повторный запуск, gate

Повторное выполнение — сравнение, которое проводит ваша машина.

Gate успешен только при точном живом совпадении — поверх trust policy, которую вы составили сами.

lispex vouch gate — локальная проверка с конкретным вопросом: если выполнить правило сейчас, на этой машине, с закреплённым запросом — получится ли ровно подписанный результат, и то ли это решение, которое я потребовал? На входе свидетельство, на выходе код завершения. Над этим стоит trust policy — короткий файл конфигурации, который вы составляете и аудируете сами: проверенный вами открытый ключ, точный вычислитель и точный исходник правила либо доказанное изображение, которые вы принимаете. Корректно подписанное правило, которого нет в вашей политике, отклоняется. Сама по себе политика ничего не разрешает — она лишь сужает то, что вы готовы проверять.

Намеренные границы

Чего не даёт успешный gate.

Каждая граница ниже намеренна. Читайте пройденный отчёт как свидетельство для вашего следующего шага — не более.

Пройденный отчёт verify или gate — не разрешение, не токен и не полномочие на внешнее действие: возвращать ли деньги, платить ли, отправлять ли — отдельное решение вашего приложения. Привязка запроса доказывает равенство с закреплённым запросом, а не свежесть, уникальность или защиту от повторной подачи. Изображение доказывает лишь целостность восстановленных байтов исходника, но не доверие к ним. npm умеет проверять и аутентифицировать, но не может выдавать, повторно выполнять или применять gate; браузерный WASM и песочница только вычисляют код. И ничто из обычного выполнения — блокировки маршрутов, измерения, вывод запусков — не становится полномочием Vouch.

Выполнить полный процесс Vouch
KO

생각의 원형을 담는 언어.

EN

The language that captures the shape of thought.

RU

Язык, воплощающий форму мысли.