Clause
← Уся документація

Перекладено з англійського оригіналу · 06042fa · 2026-10-09 · Читати англійською

Native records

Рішення плану 11, step 31A (2026-10-07). Воно окреслює форми record з OTP 29, що виходять за межі звичайних кортежних record, і фіксує їхнє подання, операції та помилки. Step 31B реалізував комірки runtime і CLAUSE_record_v1; 31C компілює локальні native records, 31D — кваліфіковані та імпортовані форми з -export_record/-import_record, 31E — анонімні форми. Кортежні record описано в термах.

OTP 29 позначає native records як експериментальні. Наведені нижче факти взято із зафіксованих вихідних кодів maint-29 (erl_lint, erl_expand_records, v3_core, beam_core_to_ssa, erts/emulator/beam/erl_record.c, utils.c, erl_printf_term.c) і живих перевірок на OTP 29.1.1.

Обсяг

Вибрано всі три форми, що виходять за межі кортежних record. Вони мають спільне подання, тож окремого рішення щодо подання для них не потрібно:

ФормаСинтаксисКрок
Native record, локальний-record #r{...}., #r{...}, X#r.f, X#r{...}, зразки, is_record/1,2,331C
Кваліфікований та імпортований#m:r{...}, X#m:r.f, X#m:r{...}, зразки; -export_record, -import_record31D
Виведений (анонімний)X#_.f, X#_{...}, зразок #_{...}31E

Не вибрано: модуль рефлексії records (бібліотека, разом із бібліотечною роботою step 39), term_to_binary (RECORD_EXT) і гаряче оновлення коду (D01). Виклики records:* лишаються діагностикою unknown module.

Подання

Операції

M — поточний модуль. Усі помилки мають клас error; вмістом badrecord є значення, що спричинило помилку, за винятком невдалого зовнішнього конструювання.

ОпераціяПриймаєНевдача
Локальне конструювання #r{...}Завжди (визначення локальне)Невідоме поле або відсутнє значення — помилки компіляції
Зовнішнє конструювання #m:r{...} (також імпортований #r{...}, також #M:r)m:r визначено в пакеті й експортовано{badrecord, {m, r}}; потім {badfield, {{m, r}, F}}, {novalue, {{m, r}, F}} (badfield має перевагу)
Локальний доступ X#r.fNative record з назвою r (модуль і прапорець експорту не перевіряються, як у runtime OTP){badrecord, X}; поле відсутнє — {badfield, {{Mod, r}, f}}
Зовнішній доступ X#m:r.fМодуль m, назва r, експортований{badrecord, X}; {badfield, ...}
Анонімний доступ X#_.fБудь-який native record (експорт не перевіряється, як у runtime OTP){badrecord, X}; {badfield, ...}
Локальне оновлення X#r{...}Модуль M, назва r{badrecord, X}; невідоме поле — {badfield, ...}
Зовнішнє оновлення X#m:r{...}Експортований, модуль m, назва rтак само
Анонімне оновлення X#_{...}Експортований або модуль Mтак само
Локальний зразок #r{...}Модуль M, назва r, кожне перелічене поле присутнєнемає збігу
Зовнішній зразок #m:r{...}Модуль m, назва r; експортований, якщо перелічено поленемає збігу
Анонімний зразок #_{...}Будь-який native record; експортований або модуль M, якщо перелічено поленемає збігу

Правила часу компіляції

Повідомлення дотримуються erl_lint:

Друк і порядок

Збережені відмінності

OTPClause
Порядок полів у display відповідає індексам атомівПорядок визначення
Зовнішнє конструювання для незавантаженого модуля завершується помилкою, доки його не завантаженоКожен модуль пакета завантажується під час старту; модуль поза пакетом завжди дає помилку
Компілятор може згорнути == між record до =:= (#r{a=1} == #r{a=1.0} дає false)== з runtime (true)
Невідомі поля в доступі/оновленні/зразках, кваліфіковане конструювання у власному модулі без значень, невикористані record або record, визначені в заголовках: попередженняБез попереджень