Clause
← Toda la documentación

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

Guards

La legalidad de los guards sigue las reglas fijadas de erl_internal/erl_lint de OTP 29; nunca se deriva del registro en tiempo de ejecución. Se comprueban todos los operandos, incluidos los inalcanzables. Un guard solo tiene éxito cuando el valor final es el átomo true.

Flujo de control

OperadorSemántica
A andalso BA debe ser booleano; false → false; en otro caso devuelve B como cualquier término
A orelse BA debe ser booleano; true → true; en otro caso devuelve B
and, or, xorAmbos operandos se evalúan en orden, ambos booleanos
not ANegación booleana

true andalso 7 devuelve 7 en un cuerpo y falla como prueba final de guard; (true andalso 7) =:= 7 tiene éxito. Un error alcanzado dentro de una expresión anidada rechaza toda la alternativa: hd([]) orelse true falla, hd([]); true tiene éxito. En los cuerpos, los operandos estrictos erróneos lanzan badarg y un operando izquierdo perezoso erróneo lanza {badarg, Value}, como en OTP.

Catálogo

guards.tsv enumera las 81 firmas de guard de las tablas fijadas guard_bif, new_type_test, old_type_test, arith_op, bool_op y comp_op, y una prueba exige la igualdad exacta del conjunto con el original de OTP. El manifiesto de auditoría asocia cada una con su resolutor, su lowering y su responsable en el runtime. Las 81 están implementadas (las que dependen de la identidad, self/0, node/0,1 e is_record/1 nativo, desde el plan step 52): self() es el pid del proceso que llama, node() y node/1 de un pid, una referencia o un puerto son nonode@nohost (hay un único nodo; cualquier otro argumento de node/1 hace fallar el guard, badarg en un cuerpo), e is_record/1 comprueba si es un record nativo. is_record/2 con el nombre de un record nativo local comprueba módulo y nombre; is_record/3 con un tercer argumento átomo comprueba el módulo y el nombre de un record nativo; el acceso a campos nativos hace fallar el guard ante cualquier desajuste.

Resolución

Limitaciones del oráculo

El OTP 29.1.1 instalado falla en la conversión SSA con algunas importaciones modernas no relacionadas detrás de alias escalares heredados; Clause rechaza explícitamente ese responsable no autorizado. El cargador de OTP también rechaza un guard con una aridad literal de record enorme, aunque lint lo acepta; ese caso solo tiene evidencia semántica.