Clause
← Toute la documentation

Traduit de l'original anglais · 06042fa · 2026-10-09 · Lire en anglais

Native records

Décision du plan 11 step 31A (2026-10-07). Elle délimite les formes de record d'OTP 29 au-delà des records ordinaires sous forme de tuples et fixe leur représentation, leurs opérations et leurs erreurs. Le step 31B a implémenté les cellules du runtime et CLAUSE_record_v1 ; 31C compile les native records locaux, 31D les formes qualifiées et importées avec -export_record/-import_record, 31E les formes anonymes. Les records tuples sont décrits dans termes.

OTP 29 classe les native records comme expérimentaux. Les faits ci-dessous proviennent des sources épinglées de 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) et de sondages en direct sur OTP 29.1.1.

Périmètre

Les trois formes au-delà des records tuples sont retenues. Elles partagent une même représentation, et n'exigent donc pas de décision de représentation séparée :

FormeSyntaxeStep
Native record, local-record #r{...}., #r{...}, X#r.f, X#r{...}, motifs, is_record/1,2,331C
Qualifié et importé#m:r{...}, X#m:r.f, X#m:r{...}, motifs ; -export_record, -import_record31D
Inféré (anonyme)X#_.f, X#_{...}, motif #_{...}31E

Non retenus : le module de réflexion records (une bibliothèque, avec le travail sur les bibliothèques du step 39), term_to_binary (RECORD_EXT) et la mise à jour de code à chaud (D01). Les appels à records:* restent des diagnostics unknown module.

Représentation

Opérations

M est le module courant. Toutes les erreurs ont la classe error ; le contenu de badrecord est la valeur fautive, sauf pour une construction externe ratée.

OpérationAccepteÉchec
Construction locale #r{...}Toujours (la définition est locale)Champ inconnu ou valeur manquante sont des erreurs de compilation
Construction externe #m:r{...} (aussi #r{...} importé, aussi #M:r)m:r défini dans le lot et exporté{badrecord, {m, r}} ; puis {badfield, {{m, r}, F}}, {novalue, {{m, r}, F}} (badfield l'emporte)
Accès local X#r.fNative record nommé r (module et indicateur d'export non vérifiés, comme le runtime d'OTP){badrecord, X} ; champ absent {badfield, {{Mod, r}, f}}
Accès externe X#m:r.fModule m, nom r, exporté{badrecord, X} ; {badfield, ...}
Accès anonyme X#_.fTout native record (export non vérifié, comme le runtime d'OTP){badrecord, X} ; {badfield, ...}
Mise à jour locale X#r{...}Module M, nom r{badrecord, X} ; champ inconnu {badfield, ...}
Mise à jour externe X#m:r{...}Exporté, module m, nom ridem
Mise à jour anonyme X#_{...}Exporté ou module Midem
Motif local #r{...}Module M, nom r, chaque champ listé présentpas de correspondance
Motif externe #m:r{...}Module m, nom r ; exporté quand un champ est listépas de correspondance
Motif anonyme #_{...}Tout native record ; exporté ou module M quand un champ est listépas de correspondance

Règles à la compilation

Les messages suivent erl_lint :

Affichage et ordre

Différences conservées

OTPClause
L'ordre des champs de display suit les index d'atomesOrdre de définition
La construction externe d'un module non chargé échoue jusqu'à son chargementChaque module du lot est chargé au démarrage ; un module hors du lot échoue toujours
Le compilateur peut réduire == entre records à =:= (#r{a=1} == #r{a=1.0} est faux)== du runtime (vrai)
Champs inconnus dans les accès/mises à jour/motifs, construction qualifiée du module lui-même sans valeurs, records inutilisés ou définis dans un en-tête : avertissementsPas d'avertissements