Полные исходники и команды приведены в руководстве Компиляция правила в промежуточную форму.
Прочитайте результат просмотра
Для примера возврата из руководства отчёт содержит следующие поля. Ниже приведён фрагмент JSON-отчёта.
{
"requirements": ["explicit-input"],
"roots": [
{
"column": 1,
"index": 0,
"line": 1,
"normalized_core": "(define decide (lambda (days) (if (<= days (quote 30)) (quote refund) (quote review))))"
},
{"column": 1, "index": 1, "line": 4, "normalized_core": "(decide input)"}
]
}Корень — выражение верхнего уровня.
Первый корень определяет decide.
Второй вызывает его с внешним значением input.
normalized_core показывает результат преобразования сокращений в основные формы.
line и column задают позицию корня в исходнике. Отсчёт начинается с 1.
| Поле отчёта | Значение |
|---|---|
artifact.source_sha256 | Идентификатор точных байтов исходника |
artifact.core_ir_sha256 | Идентификатор всего файла Core IR |
artifact.counts | Число корней, узлов, привязок, функций, глобальных переменных и требований |
globals | ID глобальных ячеек, имена и начальные ID встроенных процедур |
requirements | Явные входные значения, необходимые программе |
roots | Читаемые нормализованные выражения и позиции в исходнике |
execution: "not-run" | Команда не выполняла правило |
authority: "integrity-only" | Отчёт описывает целостность файла |
Ячейка хранит значение переменной.
Привязка связывает переменную с ячейкой.
Компилятор читает файл .lpxir.
Отчёт просмотра показывает выбранные сведения для разбора.
Фиксированные идентификаторы
| Элемент | Идентификатор |
|---|---|
| Схема файла | lispex.core-ir/v1 |
| Профиль языка | lispex-profile-1.5 |
| Реестр примитивов | lispex.primitive-registry/v1 |
| Модель стоимости | lispex.core-ir-cost/v1 |
| Семейство производителя | lispex-rust-core-ir/v1 |
| Домен хеша файла | lispex/core-ir-hash/v1 |
| Домен хеша реестра | lispex/primitive-registry-hash/v1 |
Реестр примитивов назначает стабильные числовые ID 205 исполняемым встроенным именам. Нормализатор преобразует сокращения, сохраняя пользовательские привязки имён. Его внутренние операции ссылаются прямо на ID примитивов. Встроенные процедуры, доступные из исходника, используют обычные изменяемые глобальные ячейки с этими начальными ID. Поэтому локальное затенение и переопределение верхнего уровня сохраняют поведение языка.
Что записано в файле
Компилятор читает точный исходник, преобразует сокращения в формы Core, разрешает привязки и замыкания, затем кодирует Core IR.
| Сведения | Назначение |
|---|---|
| ID лексических и глобальных ячеек | Определяют переменную по области видимости или глобальному хранилищу |
Фиксированные и остальные параметры, let, letrec, внутренние определения | Записывают места создания привязок |
| Перенаправляющие ячейки определений | Связывают ссылки с определениями, активированными при выполнении |
| Захваты замыканий | Совместно используют изменяемые внешние ячейки, в том числе нужные вложенным функциям |
| Обычные и хвостовые вызовы | Сохраняют позиции вызовов, уже определённые Core IR |
| Контексты нуля, одного и нескольких значений | Записывают, сколько значений принимает контекст |
guard, исключения, продолжения и dynamic-wind | Записывают структуры управления |
| Литеральные данные и позиции | Сохраняют константы и их расположение |
| Явные требования к вводу | Указывают вызывающей стороне нужные внешние значения |
| ID реестра и модели стоимости | Определяют встроенные процедуры и ресурсные правила |
Читаемое представление восстанавливает нормализованный Core, использованный перед преобразованием в Core IR. Другие реализации среды выполнения записывают собственные идентификаторы и результаты выполнения.
Кодирование и строгое чтение
Каноническое кодирование задаёт единственное байтовое представление всех записанных сведений. Они включают идентификатор исходника и позиции в нём. Поэтому две программы с одинаковым результатом могут иметь разные байты Core IR.
Формат — JSON в UTF-8 с фиксированным порядком полей и массивами с тегами. Он использует минимальную десятичную запись неотрицательных целых, точные строки Unicode и ровно один завершающий LF. Для глобальных переменных, требований, захватов, привязок и функций заданы порядок и непрерывность ID.
Считыватель отклоняет повторные, отсутствующие, неожиданные или переставленные поля. Также отклоняются альтернативная запись чисел и данных, неизвестные теги или ID, оборванные ссылки, неверные захваты и хвостовые позиции. Позиции в исходнике должны быть допустимыми. Лишние байты в конце и любое отличие после повторного кодирования приводят к отказу.
Пределы и идентификаторы файлов
Пределы проверяются до чтения таблиц и выделения памяти.
| Элемент | Максимум |
|---|---|
| Входной исходник | 4 MiB |
| Файл Core IR | 16 MiB |
| Узлы выражений | 100 000 |
| Привязки | 100 000 |
| Функции | 100 000 |
| Глобальные переменные | 100 000 |
| Структурная глубина | 1 024 |
source_sha256 идентифицирует точные байты исходника с существующим доменом хеша исходника.
core_ir_sha256 идентифицирует весь канонический файл с отдельным доменом хеша.
Домен хеша — фиксированный префикс, различающий виды хешируемых данных.
Получатель использует эти поля отчёта напрямую.
Команды и коды завершения
Команды предоставляет Native.
| Команда | Результат при успехе |
|---|---|
core-ir build с именованным файлом | Файл и отчёт lispex.core-ir-build/v1 |
core-ir build --out - | Только байты Core IR в stdout |
core-ir inspect | Отчёт lispex.core-ir-inspection/v1 |
core-ir validate | Отчёт lispex.core-ir-validation/v1 с valid: true |
| Код | Значение |
|---|---|
| 0 | Команда выполнена |
| 1 | Ошибка исходника или проверки |
| 2 | Ошибка использования |
| 3 | Достигнут объявленный ресурсный предел, ошибка ввода-вывода или публикации файла |
npm, открытый WASM и Песочница выполняют исходники через эталонную среду выполнения. Различия продуктов описаны в Реализациях среды выполнения.
Meaning Graph и Ваучер Лиспекса
Core IR записывает разрешённые ячейки, захваты и хвостовые позиции нормализованного профиля языка. Native переносит эти сведения в Meaning Graph v1 с сохранением идентификаторов.
| Команда | Формат и поведение |
|---|---|
lower без выбора версии | Именной csk.meaning-graph/v0 |
diff-receipt | Существующий отчёт сравнения v0 |
lower --graph-version v1 | csk.meaning-graph/v1 с разрешёнными ссылками из проверенного Core IR |
eval-graph | Выбирает v0 или v1 по тегу графа |
meaning-diff | csk.meaning-differential-report/v1 |
Ваучер Лиспекса повторно создаёт Core IR из аутентифицированного точного исходника в процессе компиляции. Аутентификация издателя определяет подписанта. Политика получателя определяет доверие. Привязка исходника и ввода определяет запрос. Повторное выполнение даёт текущий результат, а проверка допуска Ваучера записывает локальное решение. Отдельный скомпилированный контейнер описан в справочнике байткода.