Песочница

Запуск правила с заданными пределами

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

Вы можете выполнить правило с явными лимитами ресурсов и проверить файл результата. В этом руководстве вычислитель решений возвращает строку, а полный вычислитель — вектор. Такой набор лимитов называется профилем ресурсов.

Установите Native Лиспекс и Python 3. Работайте в новом каталоге. Сохраняйте текстовые файлы в UTF-8 с переводами строк LF. Команды создают новые файлы, поэтому при повторении выбирайте свободные имена результатов.

Выберите вычислитель

КомандаПрофиль языкаПример
lispex embedlispex/r7rs-rule-embedded-core/1Возвращает "allow" или "deny"
lispex embed fulllispex/r7rs-rule-current-profile-bounded/1Возвращает вектор в профиле со всеми 205 примитивными процедурами

Это два отдельных продукта. Каждая подготовка или вычисление использует новый экземпляр со своей памятью и счётчиками расхода ресурсов. Оба выполняют модули WASM без импортов.

1. Создайте исходник и ввод

Сохраните полное правило решения в policy.lspx. Вычислитель связывает входное значение с именем input.

LISPEX
(if (< input 15) "allow" "deny")

Для целого числа 14 правило возвращает "allow". Создайте make-input.py, чтобы записать это число в двоичном формате lispex.embed-value/v1.

PYTHON
from pathlib import Path

Path("input.lpxvalue").write_bytes(bytes.fromhex("03 0000000000000002 3134"))
print("input.lpxvalue: 11 bytes (integer 14)")

Запустите скрипт.

SH
python make-input.py

Он печатает следующую строку, создаёт input.lpxvalue и завершается с кодом 0.

input.lpxvalue: 11 bytes (integer 14)

Файл содержит все 11 байтов, указанных в скрипте. Первый байт обозначает точное целое число. Следующие восемь задают длину 2, а последние два содержат текст 14 в UTF-8. Обычный файл JSON использует другую кодировку.

2. Задайте лимиты подготовки и вычисления

Создайте prepare-limits.json.

JSON
{
  "raw_source_bytes": 4096,
  "prepare_work": 1000000,
  "logical_allocation": 1000000,
  "syntax_depth": 64
}

Создайте evaluation-limits.json.

JSON
{
  "canonical_input_bytes": 4096,
  "eval_work": 1000000,
  "logical_allocation": 1000000,
  "semantic_frames": 1000,
  "traversal_depth": 256,
  "output_bytes": 1000000,
  "diagnostic_bytes": 1000000,
  "transcript_bytes": 1000000,
  "transcript_events": 100,
  "result_bytes": 1000000
}

prepare_work ограничивает работу подготовки, а eval_work — работу вычисления. logical_allocation считает выделение в единицах ресурсной модели вычислителя. Это отдельный лимит от памяти WASM. Остальные поля ограничивают размер ввода, глубину, вывод, диагностику, запись событий и результат. Запись событий сохраняет порядок событий вычисления.

3. Выполните правило решения

Подготовка читает UTF-8, разворачивает сокращённые формы, создаёт и проверяет байткод. Затем она проверяет выбранный профиль языка. Она записывает исходник, семантическое правило, набор возможностей, байткод, вычислитель и лимиты подготовки.

SH
lispex embed prepare --source policy.lspx --limits prepare-limits.json --out policy.lpxembed
lispex embed evaluate --prepared policy.lpxembed --input input.lpxvalue --limits evaluation-limits.json --out result.lpxembed
lispex embed inspect --artifact result.lpxembed

Все три команды завершаются с кодом 0. prepare создаёт policy.lpxembed, а evaluate — result.lpxembed. Обе команды ничего не печатают. inspect не создаёт файлов и печатает следующий JSON. Здесь он отформатирован для чтения.

JSON содержит идентификаторы вычислителя, правила, ввода и статус завершения. semantic-complete означает, что правило выполнено. inspect показывает статус и идентификаторы; закодированное возвращённое значение хранится в result.lpxembed. Хеши ниже относятся к точным байтам примера, включая последний LF в исходнике.

Файл исхода хранит лимиты подготовки и вычисления раздельно. JSON проверки содержит идентификаторы и статус, а не перечень счётчиков расхода ресурсов.

JSON
{
  "abi_id": "lispex.embed-wasm-abi/v1",
  "bytecode_sha256": "4d3707ba9a0b64f5165ebd0996dd8b2fa5bf4c958f7afbc9062203f46f8eb068",
  "canonical_input_sha256": "4892c71b4803d6f2057433116b87927c62eed7754252cd5048a8663903cf6e2c",
  "canonical_source_sha256": "a8cc61bac9abf9d6f8647a529402d348a4d045f1006f3b4c67f21adefa33743e",
  "category": "semantic-complete",
  "code": "complete",
  "engine_artifact_sha256": "fa6e52559e1f5a43e50a3b7ac0cc5add6930cff0aed8aaff462cff4609362870",
  "feature_set_sha256": "c7ac2d3037b43dd90889467aabdcd2d3c061559bde12bb8330d878886c5ab429",
  "model_id": "lispex-vm-meter/1",
  "operation": "evaluate",
  "payload_bytes": "23",
  "portable": true,
  "portable_core_bytes": "1900",
  "portable_core_sha256": "9949d0c240c3e641cbee652c7d05d32612414759e77bbf3d5d91ff63b2bdfd5f",
  "receipt_schema_id": "lispex.embed-receipt-core/v1",
  "schema": "lispex.embed-artifact-inspection/v1",
  "semantic_profile_id": "lispex/r7rs-rule-embedded-core/1",
  "semantic_rule_sha256": "2419de25f5fcec98e74d9119c28687ab5b440be322502f8f7b24cec19424dc22",
  "submission_sha256": "aa9f358366f58ab0fbc36c93c974b27ce908a10eb0898ad9313e756072d6552f",
  "submitted_source_sha256": "30a60354485c671766d6a7196b3418529304f3feae6ca040999715fd90f9f847",
  "vouch_eligible": false
}

Проверьте сохранённый результат.

SH
lispex embed verify --artifact result.lpxembed

Команда печатает тот же JSON и завершается с кодом 0. Она проверяет структуру, хеши, значения и переносимую основную запись, а также идентификатор встроенного вычислителя. Переносимая основная запись связывает один запуск с его вводом и исходом. verify не создаёт файлов.

4. Запустите полный вычислитель

Сохраните полный исходник в full-policy.lspx. Он использует vector из полного профиля языка и возвращает #(14 15) для того же ввода.

LISPEX
(vector input (+ input 1))

Используйте файлы ввода и лимитов из шагов 1 и 2.

SH
lispex embed full prepare --source full-policy.lspx --limits prepare-limits.json --out policy.lpxfull
lispex embed full evaluate --prepared policy.lpxfull --input input.lpxvalue --limits evaluation-limits.json --out result.lpxfull
lispex embed full inspect --artifact result.lpxfull

Все три команды завершаются с кодом 0. Первые две ничего не печатают и создают policy.lpxfull и result.lpxfull. inspect не создаёт файлов и печатает JSON, отформатированный ниже. Полный вычислитель обозначает успешный исход как complete.

JSON
{
  "abi_id": "lispex.embed-wasm-abi/v1",
  "category": "complete",
  "code": "complete",
  "component_id": "lispex-evaluator/rust-vm-current-profile/1",
  "engine_artifact_sha256": "dd4cde2976d825ae99b542d308d87489ac96848e0710329dbb9173664d8c5ad8",
  "fallback_count": 0,
  "kind": "evaluate",
  "model_id": "lispex-full-vm-meter/1",
  "portable_core_assigned": true,
  "portable_core_bytes": "1932",
  "portable_core_sha256": "1201ac2939e678db7926d160deb4ccb4a566a5d74b15fe19076bdd48bd88e730",
  "receipt_schema_id": "lispex.embed-receipt-core/v1",
  "replayable": true,
  "request_sha256": "05d3c7bb9ee45728e8dcd6f84e974e76d225c3cd1c77799332fd8d12ff25bcb3",
  "schema": "lispex.full-embed-artifact/v0",
  "semantic_profile_id": "lispex/r7rs-rule-current-profile-bounded/1",
  "source_retained": false,
  "value_codec_id": "lispex.embed-value/v1",
  "vouch_eligible": false
}

Проверьте результат, затем повторите записанный запрос в новом экземпляре.

SH
lispex embed full verify --artifact result.lpxfull
lispex embed full replay --artifact result.lpxfull

Каждая команда печатает тот же JSON полного вычислителя, завершается с кодом 0 и не создаёт файлов. Повторный запуск проверяет записанный ответ и переносимую основную запись. Храните исходник отдельно: файл полного вычислителя сохраняет его идентификатор и подготовленную программу.

Для повторного вычисления решения снова передайте подготовленный файл, ввод и лимиты.

SH
lispex embed evaluate --prepared policy.lpxembed --input input.lpxvalue --limits evaluation-limits.json --out rerun.lpxembed

Команда ничего не печатает, создаёт rerun.lpxembed и завершается с кодом 0. Каталог решения с командой повторного выполнения описан в руководстве по решающим правилам.

5. Прочитайте остановку по лимиту

Создайте low-work-limits.json с полным содержимым ниже. По сравнению с шагом 2 изменяется только eval_work.

JSON
{
  "canonical_input_bytes": 4096,
  "eval_work": 0,
  "logical_allocation": 1000000,
  "semantic_frames": 1000,
  "traversal_depth": 256,
  "output_bytes": 1000000,
  "diagnostic_bytes": 1000000,
  "transcript_bytes": 1000000,
  "transcript_events": 100,
  "result_bytes": 1000000
}
SH
lispex embed evaluate --prepared policy.lpxembed --input input.lpxvalue --limits low-work-limits.json --out exhausted.lpxembed
lispex embed inspect --artifact exhausted.lpxembed
lispex embed full evaluate --prepared policy.lpxfull --input input.lpxvalue --limits low-work-limits.json --out exhausted.lpxfull
lispex embed full inspect --artifact exhausted.lpxfull

Все четыре команды завершаются с кодом 0. Каждая команда evaluate ничего не печатает и создаёт указанный файл exhausted. Каждая команда inspect печатает отчёт JSON. Ниже показаны поля, определяющие исход в этих отчётах.

Выбранные поля вывода вычислителя решений

JSON
{
  "category": "semantic-exhausted",
  "code": "eval_work"
}

Выбранные поля вывода полного вычислителя

JSON
{
  "category": "exhausted",
  "code": "eval_work"
}

eval_work указывает исчерпанный ресурс. Нулевой лимит работы останавливает вычисление до получения значения правила. Код завершения 0 означает, что файл исхода успешно записан. Поле category показывает, завершилось ли правило.

Используйте результат в приложении

Файл исхода связывает правило, ввод, выбранные лимиты, вычислитель, запись событий и результат. Обмен решениями добавляет контейнеры подписанных записей и политику получателя. Ваучер Лиспекса аутентифицирует подписанные данные и проверяет локальное условие допуска действия. Вызывающее приложение решает вопросы сетевого доступа и деловых действий.

Условия выполнения · Справочник вычислителя