Песочница

Компиляция правила в промежуточную форму

Создайте файл Core IR из полного правила размещения заголовка, изучите ссылки имён и передайте файл компилятору байткода.

Команды Core IR из этого руководства предоставляет Native CLI. Core IR представляет собой промежуточное представление с разрешёнными ссылками имён. Оно записывает, на какую переменную ссылается каждое имя, до выполнения программы.

Сохраните исходник

Сохраните всю программу в heading-core.lspx.

LISPEX
(define (место-заголовка осталось-строк)
  (if (< осталось-строк 2) 'следующая-страница 'оставить))

(место-заголовка input)

Правило возвращает следующая-страница, если под заголовком осталось меньше двух строк, и оставить в остальных случаях. Вызывающая сторона передаёт число строк через input. Сборка Core IR записывает это требование без выполнения правила.

Соберите файл Core IR

SH
lispex core-ir build --source heading-core.lspx --out heading-core.lpxir

Команда создаёт heading-core.lpxir, печатает JSON-отчёт сборки и завершается с кодом 0. Файл по указанному пути должен отсутствовать. Если такой файл уже есть, команда завершается с кодом 3 и не изменяет его.

Ниже приведены отдельные поля отчёта.

JSON
{
  "authority": "integrity-only",
  "core_ir_build": "lispex.core-ir-build/v1",
  "execution": "not-run"
}

Отчёт также содержит идентификаторы исходника и файла, профиль языка и размеры таблиц. Компилятор сохраняет файл lispex.core-ir/v1 отдельно от отчёта.

Прочитайте имена и позиции в исходнике

SH
lispex core-ir inspect --ir heading-core.lpxir

Команда завершается с кодом 0 и печатает отчёт просмотра. В этом фрагменте показаны имена и два выражения верхнего уровня.

JSON
{
  "execution": "not-run",
  "globals": [
    {
      "id": 0,
      "initial_primitive": {
        "id": 6,
        "name": "<"
      },
      "name": "<"
    },
    {
      "id": 1,
      "initial_primitive": null,
      "name": "input"
    },
    {
      "id": 2,
      "initial_primitive": null,
      "name": "место-заголовка"
    }
  ],
  "requirements": [
    "explicit-input"
  ],
  "roots": [
    {
      "column": 1,
      "index": 0,
      "line": 1,
      "normalized_core": "(define место-заголовка (lambda (осталось-строк) (if (< осталось-строк (quote 2)) (quote следующая-страница) (quote оставить))))"
    },
    {
      "column": 1,
      "index": 1,
      "line": 4,
      "normalized_core": "(место-заголовка input)"
    }
  ]
}

место-заголовка ссылается на глобальную ячейку 2. Ячейка < начинается со встроенной процедуры ID 6. input использует ячейку 1 и добавляет требование explicit-input.

Первое выражение превращается в определение с lambda. Второе остаётся вызовом (место-заголовка input) в строке 4, столбце 1. Корень обозначает одно выражение верхнего уровня. Отчёт насчитывает 2 корня, 12 узлов выражений, 1 привязку параметра и 1 функцию.

Полный отчёт содержит artifact.source_sha256 и artifact.core_ir_sha256. Они идентифицируют точные байты исходника и весь файл Core IR. Изменение пробелов в исходнике может изменить идентификаторы, даже если результат правила остался прежним.

Проверьте сохранённый файл

SH
lispex core-ir validate --ir heading-core.lpxir

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

JSON
{
  "core_ir_validation": "lispex.core-ir-validation/v1",
  "valid": true
}

Проверка охватывает пределы размера и количества, структуру JSON и идентификаторы схемы, профиля и реестра встроенных процедур. Также проверяются позиции в исходнике, ссылки и позиции хвостовых вызовов. Проверяются и захваты, то есть внешние ячейки переменных, которые использует функция. Считыватель принимает только единственное установленное байтовое представление. Файл с изменённым порядком полей или пробелами отклоняется.

Передайте файл компилятору

Передайте heading-core.lpxir команде bytecode build. Руководство по байткоду продолжает тот же пример, добавляет request.lspx и запускает результат.

ОбъектНазначение
heading-core.lspxИсходная программа
heading-core.lpxirПрограмма с разрешёнными ссылками для компилятора
Отчёты сборки, просмотра и проверкиJSON для чтения человеком и средствами автоматизации
heading-core.lpxbcСкомпилированные инструкции для виртуальной машины

Для стандартных потоков укажите --source - или --out -. С --out - stdout содержит только байты Core IR, а диагностика идёт в stderr. Сохраняйте эти байты напрямую, без добавления отчёта и изменения кодировки.

Связанные форматы

Native также может создать из Core IR граф Meaning Graph. Справочник Core IR описывает команды и форматы v0 и v1.

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