Clause
← Toda a documentação

Traduzido do original em inglês · 1e3a39c8-dirty · 2026-10-26 · 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: self() é o pid do processo chamador, node() e node/1 de um pid, referência ou porta são nonode@nohost (há um único nó; qualquer outro argumento de node/1 faz falhar a guard, badarg num corpo). Native records em guards: is_record/1,2,3 e o acesso a campos tal como em native records.

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.