Clause
← Toda a documentação

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

Padrões, cláusulas e correspondências no corpo

As cabeças de cláusulas de função, as correspondências no corpo, as cláusulas case e as guards de if são executáveis para todos os tipos de termos admitidos (termos). A legalidade e a disponibilidade são verificadas separadamente: Erlang inválido é um erro semântico mesmo em código inalcançável; código legal que precisa de uma funcionalidade em falta recebe um diagnóstico de capacidade; uma não correspondência em tempo de execução nunca é um erro do compilador.

ContextoEstado
Cabeças de função + guardsImplementado; o esgotamento lança error:function_clause
Correspondências e sequências no corpo, begin/endImplementado; a falha lança error:{badmatch, RHS}
Cláusulas case + guardsImplementado; o esgotamento lança error:{case_clause, Value}
Cláusulas de guard de ifImplementado; o esgotamento lança error:if_clause
maybe com ?= e cláusulas elseImplementado; um ?= falhado produz o seu valor ou seleciona uma cláusula else, cujo esgotamento lança error:{else_clause, Value}; requer a feature maybe_expr (pré-processador)
Comprehensions de lista, binary e mapImplementado (abaixo)
catch ExprImplementado; sem padrões (ABI)
Cláusulas of e catch de tryImplementado; o esgotamento de of lança error:{try_clause, Value}, as exceções não correspondidas são relançadas e after corre em todos os caminhos (ABI); Class:Reason:Stack associa o rastreio de pilha
Cláusulas de funCapacidade (F18)
receiveCapacidade (F22/F25)

Comprehensions

[T1, ..., Tn || Q1, ..., Qm], << T || Q1, ... >> e #{K => V, ... || Q1, ... } seguem o OTP 29:

Cada gerador é um ciclo no corpo da função cujo cursor de entrada (o resto de uma lista ou de um bitstring, ou um map e uma posição) vive em slots de termos do frame; os elementos produzidos acumulam-se invertidos noutro slot de termo e tornam-se a lista, o bitstring unido ou o map de uma só vez no fim, pelo que entradas longas precisam de pilha nativa e de processo constante.

Formas de padrões

FormaRegraRejeição
_Nunca associa; ocorrências independentesLer _ é semântico
Name, _Name, repetiçõesAtribuição única; as repetições exigem igualdade exata (1 ≠ 1.0)Leitura não associada/insegura é semântica; desigualdade é não correspondência
P1 = P2, parêntesesAmbos restringem o mesmo valor; sem associações de chave/tamanho entre irmãosDependência ilegal entre irmãos é semântica
Átomos, inteiros, caracteres, floatsIgualdade exata; zero com sinal distintoNão correspondência
Aritmética constanteOperadores de padrão do OTP reduzidos exatamente; 1 div 0 e não constantes rejeitadosSemântico
Tuplos, listas, caudas impróprias, stringsAridade exata e forma cons/nil; as strings são listasNão correspondência
"prefix" ++ TailApenas prefixo de string literal ou de lista de inteiros literalPrefixo variável é semântico
#{K := P}Apenas :=; chaves extra permitidas; #{} testa o tipo; as chaves são expressões de guard sobre as associações recebidas=>, chave não associada é semântico; chave em falta é não correspondência
BitstringsTipo/tamanho/unidade validados; segmentos anteriores podem dimensionar os posteriores; cauda sem tamanho no fimEspecificador inválido é semântico; dados curtos são não correspondência
Records em tuplo #r{f = P}, #r.fExpandidos em restrições de tuplo; campos omitidos sem restriçãoRecord/campo desconhecido é semântico
Native records locais #r{f = P}Record deste módulo chamado r, depois cada campo listado (um campo em falta falha)Record desconhecido é semântico
Native records qualificados/importados #m:r{f = P}Record do módulo m chamado r; exportado quando um campo é listado; depois cada campoNenhuma em tempo de compilação
Records anónimos #_{f = P}Qualquer native record; exportado ou definido neste módulo quando um campo é listado#_{...} como expressão é um erro
Chamadas, aritmética com variáveis, outras expressõesNão são padrõesSemântico

Âmbitos

As chaves de map e os tamanhos de binary leem o ambiente recebido, nunca os irmãos: #{K := V} = #{key := K} e <<X:N>> = <<N:8>> não podem associar a sua própria chave ou tamanho. Dentro de um mesmo binary, um tamanho pode ler segmentos anteriores: <<N:8, X:N>> é legal; {N, <<X:N>>} precisa de N associado previamente. Aritmética constante inválida numa chave ou tamanho é legal e falha no momento da correspondência.

A validação de binaries rejeita segmentos de contentores aninhados/aliases, modificadores em conflito, intervalos de unidade inválidos, unidade sem tamanho para os valores por omissão integer/float, tamanho/unidade UTF inválidos, strings literais com tipo/tamanho e segmentos binary sem tamanho que não sejam os últimos.

Execução

Limites

A normalização de padrões partilha o orçamento semântico de 1 000 000 de unidades do módulo (um inteiro custa cerca do seu número de dígitos decimais); uma constante acima do limite de inteiros de 4 194 240 bits é um illegal pattern, como no OTP (termos). Cada plano de correspondência tem um teto de 100 000 unidades de trabalho. O parser limita separadamente o aninhamento a 256 (teto absoluto de 512).