Clause
← Toute la documentation

Traduit de l'original anglais · 06042fa · 2026-10-09 · Lire en anglais

Gardes

La légalité des gardes suit les règles erl_internal/erl_lint épinglées d'OTP 29 ; elle n'est jamais déduite de l'enregistrement au runtime. Chaque opérande est vérifié, y compris les opérandes inaccessibles. Une garde ne réussit que lorsque la valeur finale est l'atome true.

Flot de contrôle

OpérateurSémantique
A andalso BA doit être booléen ; false → false ; sinon renvoie B comme terme quelconque
A orelse BA doit être booléen ; true → true ; sinon renvoie B
and, or, xorLes deux opérandes évalués dans l'ordre, tous deux booléens
not AInverse booléen

true andalso 7 renvoie 7 dans un corps et échoue comme test final de garde ; (true andalso 7) =:= 7 réussit. Une erreur atteinte dans une expression imbriquée rejette toute l'alternative : hd([]) orelse true échoue, hd([]); true réussit. Dans les corps, des opérandes stricts incorrects lèvent badarg et un opérande gauche paresseux incorrect lève {badarg, Value}, comme dans OTP.

Catalogue

guards.tsv liste les 81 signatures de garde issues des tables épinglées guard_bif, new_type_test, old_type_test, arith_op, bool_op et comp_op, et un test impose l'égalité exacte des ensembles avec l'amont. Le manifeste d'audit associe chacune à un résolveur, un abaissement et un responsable runtime. Les 81 sont toutes implémentées (celles qui dépendent de l'identité, self/0, node/0,1 et is_record/1 natif, depuis le plan step 52) : self() est le pid du processus appelant, node() et node/1 d'un pid, d'une référence ou d'un port valent nonode@nohost (il n'y a qu'un nœud ; tout autre argument de node/1 fait échouer la garde, badarg dans un corps), et is_record/1 teste s'il s'agit d'un native record. is_record/2 avec un nom de native record local teste le module et le nom ; is_record/3 avec un troisième argument atome teste le module et le nom d'un native record ; l'accès à un champ natif fait échouer la garde en cas de non-correspondance quelconque.

Résolution

Limites de l'oracle

OTP 29.1.1 installé plante lors de la conversion SSA pour certains imports modernes sans rapport masqués par d'anciens alias scalaires ; Clause rejette explicitement ce responsable non autorisé. Le chargeur d'OTP rejette aussi une garde avec une arité de record littérale énorme bien que le lint l'accepte ; ce cas n'a qu'une preuve sémantique.