lawref.evaluator.constants
§54: разыменование ссылок на константы пакета перед исполнением.
Константа объявляется декларацией (const KZ: Jurisdiction = …) и живёт в
CLIR узлом symbol_decl вида constant; терм, который её называет, остаётся
ссылкой const_ref (§53). Программа — это ссылка, исполнение — значение, и
здесь проходит граница между ними.
Почему один предпроход, а не разыменование по месту. Ссылка встречается в
двух ролях сразу: в позиции ТЕРМА (гард r <= MAX_RATE, арифметика §58) и в
позиции АРГУМЕНТА литерала (member_of(p, StateDuma)). Первую разрешает
вычислитель термов, вторую — сопоставление с фактами по ключу атома
(literal_key). Разыменуй мы только первую — правило и факт об одном и том же
индивиде получили бы РАЗНЫЕ ключи и молча перестали совпадать; это ровно тот
класс отказа, ради которого заведён E-0040. Разыменование обеих по отдельности
требует, чтобы две ветки давали побайтово одну форму терма, и расхождение
между ними было бы невидимо. Предпроход снимает вопрос: ниже него ссылок на
константы не существует вовсе.
Следствие, названное прямо: в evaluation-документе (атомы, proof-граф,
вербализация) стоит ЗНАЧЕНИЕ константы, а не её имя. Имя остаётся в CLIR — в
узле symbol_decl и в исходнике. Обратный выбор — публиковать ссылку —
означал бы, что форма опубликованного атома зависит от того, какая сторона
попала в store первой (SupportStore.atoms хранит первую), то есть от порядка
узлов; §211 такого не допускает.
Быстрый выход обязателен, а не является оптимизацией. Пакет без единой константы обязан пройти этот модуль, не изменив ни одного байта: только так differential остаётся байтовым на всех замороженных голденах, ни один из которых констант не несёт.
Classes
| Name | Description |
|---|---|
ConstantError | Ошибка разыменования константы; code — машинный код для issue. |
Functions
| Name | Description |
|---|---|
resolve | Разыменовать константы во всех переданных списках узлов. |
resolved_table | Таблица §54, чьи значения САМИ прошли разыменование (константа через |
table | Таблица §54 по списку узлов — для вида программы (prepared). |
walk | Разыменовать по готовой таблице; пустая таблица — те же объекты. |
ConstantErrorclass#
class ConstantError(code: str, message: str)Bases: Exception
Ошибка разыменования константы; code — машинный код для issue.
resolvefunction#
def resolve(*node_lists: list[dict]) -> tuple[list[dict], ...]Разыменовать константы во всех переданных списках узлов.
Списки обрабатываются вместе и таблица строится по их объединению: факты дела ссылаются на константы ПРОГРАММЫ, и раздельный проход дал бы стороне дела нетронутую ссылку — то самое расхождение ключей, ради которого предпроход и существует.
Возвращает списки в том же порядке. Если констант нет — те же объекты, без единой копии.
resolved_tablefunction#
def resolved_table(nodes: list[dict]) -> dict[str, dict]Таблица §54, чьи значения САМИ прошли разыменование (константа через константу), — форма, в которой константу видит программа НИЖЕ предпрохода.
Нужна свёртке §161.1: она публикует состояния и переходы профиля §164.1 и обязана давать ту же форму терма, что предпроход даёт вопросу и фактам, — иначе вывод и вопрос об одном состоянии получают разные ключи атома (E-0148, сверка №4 п. 3). Цикла здесь быть уже не может: предпроход прошёл раньше и на цикле отказал.
tablefunction#
def table(nodes: list[dict]) -> dict[str, dict]Таблица §54 по списку узлов — для вида программы (prepared).
walkfunction#
def walk(nodes: Any, table: dict[str, dict]) -> AnyРазыменовать по готовой таблице; пустая таблица — те же объекты.
Documentation for Arxo. Writings — blog.arxo.io.
Anonymous visit counts on stats.arxo.io, no cookies.