Clause
← Toda a documentação

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

Guards

A legalidade das guards segue as regras erl_internal/erl_lint do OTP 29 fixado; nunca é derivada do registo no runtime. Todos os operandos são verificados, incluindo os inalcançáveis. Uma guard só tem sucesso quando o valor final é o átomo true.

Fluxo de controlo

OperadorSemântica
A andalso BA tem de ser booleano; false → false; caso contrário devolve B como qualquer termo
A orelse BA tem de ser booleano; true → true; caso contrário devolve B
and, or, xorAmbos os operandos avaliados por ordem, ambos booleanos
not AInverso booleano

true andalso 7 devolve 7 num corpo e falha como teste final de uma guard; (true andalso 7) =:= 7 tem sucesso. Um erro alcançado dentro de uma expressão aninhada rejeita toda a alternativa: hd([]) orelse true falha, hd([]); true tem sucesso. Nos corpos, operandos estritos inválidos lançam badarg e um operando esquerdo preguiçoso inválido lança {badarg, Value}, como no OTP.

Catálogo

guards.tsv lista as 81 assinaturas de guards das tabelas fixadas guard_bif, new_type_test, old_type_test, arith_op, bool_op e comp_op, e um teste impõe a igualdade exata do conjunto com o upstream. O manifesto de auditoria associa cada uma ao resolvedor, ao rebaixamento e ao responsável no runtime. As 81 estão todas implementadas (as dependentes de identidade self/0, node/0,1 e is_record/1 nativo desde o step 52 do plano): self() é o pid do processo chamador, node() e node/1 de um pid, referência ou port são nonode@nohost (há um único nó; qualquer outro argumento de node/1 faz falhar a guard, badarg num corpo), e is_record/1 testa se se trata de um native record. is_record/2 com o nome de um native record local testa o módulo e o nome; is_record/3 com um terceiro argumento átomo testa o módulo e o nome de um native record; o acesso a campos nativos faz falhar a guard em qualquer discordância.

Resolução

Limitações do oráculo

O OTP 29.1.1 instalado falha na conversão SSA para algumas importações modernas não relacionadas por trás de aliases escalares legados; o Clause rejeita explicitamente esse responsável não autorizado. O carregador do OTP também rejeita uma guard com uma aridade literal de record enorme, apesar de o lint a aceitar; esse caso só tem evidência semântica.