Clause
← Gesamte Dokumentation

Übersetzt aus dem englischen Original · 06042fa · 2026-10-09 · Auf Englisch lesen

Native Records

Entscheidung von plan 11 step 31A (2026-10-07). Sie legt den Umfang der OTP-29-Record-Formen jenseits gewöhnlicher Tupel-Records fest und bestimmt ihre Darstellung, Operationen und Fehler. Step 31B implementierte die Runtime-Zellen und CLAUSE_record_v1; 31C kompiliert lokale native Records, 31D qualifizierte und importierte Formen mit -export_record/-import_record, 31E anonyme Formen. Tupel-Records stehen unter Terme.

OTP 29 kennzeichnet native Records als experimentell. Die folgenden Fakten stammen aus den festgelegten maint-29-Quellen (erl_lint, erl_expand_records, v3_core, beam_core_to_ssa, erts/emulator/beam/erl_record.c, utils.c, erl_printf_term.c) und aus Live-Proben mit OTP 29.1.1.

Umfang

Alle drei Formen jenseits der Tupel-Records sind ausgewählt. Sie teilen eine Darstellung, daher brauchen sie keine separate Entscheidung zur Darstellung:

FormSyntaxSchritt
Nativer Record, lokal-record #r{...}., #r{...}, X#r.f, X#r{...}, Muster, is_record/1,2,331C
Qualifiziert und importiert#m:r{...}, X#m:r.f, X#m:r{...}, Muster; -export_record, -import_record31D
Inferiert (anonym)X#_.f, X#_{...}, Muster #_{...}31E

Nicht ausgewählt: das Reflexionsmodul records (eine Bibliothek, mit der Bibliotheksarbeit von step 39), term_to_binary (RECORD_EXT) und Hot Code Upgrade (D01). Aufrufe von records:* bleiben Diagnosen unknown module.

Darstellung

Operationen

M ist das aktuelle Modul. Alle Fehler haben die Klasse error; badrecord-Nutzlasten sind der fehlerhafte Wert, außer bei fehlgeschlagener externer Konstruktion.

OperationAkzeptiertFehlschlag
Lokale Konstruktion #r{...}Immer (Definition ist lokal)Unbekanntes Feld oder fehlender Wert sind Kompilierfehler
Externe Konstruktion #m:r{...} (auch importiertes #r{...}, auch #M:r)m:r im Batch definiert und exportiert{badrecord, {m, r}}; dann {badfield, {{m, r}, F}}, {novalue, {{m, r}, F}} (badfield gewinnt)
Lokaler Zugriff X#r.fNativer Record namens r (Modul und Export-Flag werden nicht geprüft, wie in der Runtime von OTP){badrecord, X}; fehlendes Feld {badfield, {{Mod, r}, f}}
Externer Zugriff X#m:r.fModul m, Name r, exportiert{badrecord, X}; {badfield, ...}
Anonymer Zugriff X#_.fJeder native Record (Export wird nicht geprüft, wie in der Runtime von OTP){badrecord, X}; {badfield, ...}
Lokale Aktualisierung X#r{...}Modul M, Name r{badrecord, X}; unbekanntes Feld {badfield, ...}
Externe Aktualisierung X#m:r{...}Exportiert, Modul m, Name rebenso
Anonyme Aktualisierung X#_{...}Exportiert oder Modul Mebenso
Lokales Muster #r{...}Modul M, Name r, jedes aufgeführte Feld vorhandenkein Match
Externes Muster #m:r{...}Modul m, Name r; exportiert, wenn ein Feld aufgeführt istkein Match
Anonymes Muster #_{...}Jeder native Record; exportiert oder Modul M, wenn ein Feld aufgeführt istkein Match

Regeln zur Compile-Zeit

Die Meldungen folgen erl_lint:

Ausgabe und Ordnung

Beibehaltene Unterschiede

OTPClause
Feldreihenfolge von display folgt Atom-IndizesDefinitionsreihenfolge
Externe Konstruktion eines nicht geladenen Moduls schlägt fehl, bis es geladen istJedes Modul des Batches wird beim Start geladen; ein Modul außerhalb des Batches schlägt immer fehl
Der Compiler kann == zwischen Records zu =:= falten (#r{a=1} == #r{a=1.0} ist false)Runtime-== (true)
Unbekannte Felder in Zugriff/Aktualisierung/Mustern, qualifizierte Konstruktion im eigenen Modul ohne Werte, ungenutzte oder in Headern definierte Records: WarnungenKeine Warnungen