Clause
← Toda a documentação

Traduzido do original em inglês · 06042fa · 2026-10-09 · Ler em inglês

Native records

Decisão do plano 11, step 31A (2026-10-07). Define o âmbito das formas de record do OTP 29 para além dos records comuns em tuplo e fixa a sua representação, operações e erros. O step 31B implementou as células do runtime e CLAUSE_record_v1; o 31C compila os native records locais, o 31D as formas qualificadas e importadas com -export_record/-import_record, o 31E as formas anónimas. Os records em tuplo estão em termos.

O OTP 29 marca os native records como experimentais. Os factos abaixo vêm dos códigos-fonte fixados 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) e de sondagens em direto no OTP 29.1.1.

Âmbito

As três formas para além dos records em tuplo foram selecionadas. Partilham uma única representação, pelo que não precisam de decisões de representação separadas:

FormaSintaxeStep
Native record, local-record #r{...}., #r{...}, X#r.f, X#r{...}, padrões, is_record/1,2,331C
Qualificado e importado#m:r{...}, X#m:r.f, X#m:r{...}, padrões; -export_record, -import_record31D
Inferido (anónimo)X#_.f, X#_{...}, padrão #_{...}31E

Não selecionados: o módulo de reflexão records (uma biblioteca, com o trabalho de bibliotecas do step 39), term_to_binary (RECORD_EXT) e a atualização de código a quente (D01). As chamadas a records:* continuam a dar diagnósticos unknown module.

Representação

Operações

M é o módulo atual. Todos os erros têm a classe error; os conteúdos de badrecord são o valor em causa, exceto na construção externa falhada.

OperaçãoAceitaFalha
Construção local #r{...}Sempre (a definição é local)Campo desconhecido ou valor em falta são erros de compilação
Construção externa #m:r{...} (também #r{...} importado, também #M:r)m:r definido no lote e exportado{badrecord, {m, r}}; depois {badfield, {{m, r}, F}}, {novalue, {{m, r}, F}} (badfield prevalece)
Acesso local X#r.fNative record chamado r (módulo e flag de exportação não verificados, como no runtime do OTP){badrecord, X}; campo em falta {badfield, {{Mod, r}, f}}
Acesso externo X#m:r.fMódulo m, nome r, exportado{badrecord, X}; {badfield, ...}
Acesso anónimo X#_.fQualquer native record (exportação não verificada, como no runtime do OTP){badrecord, X}; {badfield, ...}
Atualização local X#r{...}Módulo M, nome r{badrecord, X}; campo desconhecido {badfield, ...}
Atualização externa X#m:r{...}Exportado, módulo m, nome rigual
Atualização anónima X#_{...}Exportado ou módulo Migual
Padrão local #r{...}Módulo M, nome r, todos os campos listados presentessem correspondência
Padrão externo #m:r{...}Módulo m, nome r; exportado quando um campo é listadosem correspondência
Padrão anónimo #_{...}Qualquer native record; exportado ou módulo M quando um campo é listadosem correspondência

Regras em tempo de compilação

As mensagens seguem o erl_lint:

Impressão e ordem

Diferenças mantidas

OTPClause
A ordem dos campos em display segue os índices dos átomosOrdem da definição
A construção externa de um módulo não carregado falha até ele ser carregadoTodos os módulos do lote são carregados no arranque; um módulo fora do lote falha sempre
O compilador pode reduzir == entre records a =:= (#r{a=1} == #r{a=1.0} é falso)== do runtime (verdadeiro)
Campos desconhecidos em acessos/atualizações/padrões, construção qualificada do próprio módulo sem valores, records não usados ou definidos em cabeçalhos: avisosSem avisos