Clause
← Toda la documentación

Traducido del original en inglés · 06042fa · 2026-10-09 · Leer en inglés

Records nativos

Decisión del plan 11 step 31A (2026-10-07). Delimita las formas de record de OTP 29 más allá de los records ordinarios de tupla y fija su representación, operaciones y errores. El step 31B implementó las celdas del runtime y CLAUSE_record_v1; 31C compila los records nativos locales, 31D las formas cualificadas e importadas con -export_record/-import_record, y 31E las formas anónimas. Los records de tupla están en términos.

OTP 29 marca los records nativos como experimentales. Los datos siguientes provienen de los fuentes fijados 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) y de pruebas en vivo sobre OTP 29.1.1.

Alcance

Se seleccionan las tres formas que van más allá de los records de tupla. Comparten una única representación, por lo que no necesitan una decisión de representación aparte:

FormaSintaxisStep
Record nativo, local-record #r{...}., #r{...}, X#r.f, X#r{...}, patrones, is_record/1,2,331C
Cualificado e importado#m:r{...}, X#m:r.f, X#m:r{...}, patrones; -export_record, -import_record31D
Inferido (anónimo)X#_.f, X#_{...}, patrón #_{...}31E

No seleccionados: el módulo de reflexión records (una biblioteca, junto con el trabajo de biblioteca del step 39), term_to_binary (RECORD_EXT) y la actualización de código en caliente (D01). Las llamadas a records:* siguen dando diagnósticos unknown module.

Representación

Operaciones

M es el módulo actual. Todos los errores tienen la clase error; el contenido de badrecord es el valor causante, salvo en la construcción externa fallida.

OperaciónAceptaFallo
Construcción local #r{...}Siempre (la definición es local)Un campo desconocido o un valor ausente son errores de compilación
Construcción externa #m:r{...} (también #r{...} importado, también #M:r)m:r definido en el lote y exportado{badrecord, {m, r}}; después {badfield, {{m, r}, F}}, {novalue, {{m, r}, F}} (prevalece badfield)
Acceso local X#r.fRecord nativo llamado r (el módulo y el indicador de exportación no se comprueban, como en el runtime de OTP){badrecord, X}; campo ausente {badfield, {{Mod, r}, f}}
Acceso externo X#m:r.fMódulo m, nombre r, exportado{badrecord, X}; {badfield, ...}
Acceso anónimo X#_.fCualquier record nativo (la exportación no se comprueba, como en el runtime de OTP){badrecord, X}; {badfield, ...}
Actualización local X#r{...}Módulo M, nombre r{badrecord, X}; campo desconocido {badfield, ...}
Actualización externa X#m:r{...}Exportado, módulo m, nombre rigual
Actualización anónima X#_{...}Exportado o módulo Migual
Patrón local #r{...}Módulo M, nombre r, todos los campos enumerados presentesno encaja
Patrón externo #m:r{...}Módulo m, nombre r; exportado cuando se enumera un campono encaja
Patrón anónimo #_{...}Cualquier record nativo; exportado o módulo M cuando se enumera un campono encaja

Reglas en tiempo de compilación

Los mensajes siguen a erl_lint:

Impresión y orden

Diferencias que se mantienen

OTPClause
El orden de campos de display sigue los índices de átomoOrden de definición
La construcción externa de un módulo no cargado falla hasta que se cargaTodos los módulos del lote se cargan al arrancar; un módulo ajeno al lote siempre falla
El compilador puede plegar == entre records a =:= (#r{a=1} == #r{a=1.0} es false)== del runtime (true)
Campos desconocidos en accesos/actualizaciones/patrones, construcción cualificada del propio módulo sin valores, records sin usar o definidos en cabeceras: advertenciasSin advertencias