Clause
← All dokumentation

Översatt från det engelska originalet · 1e3a39c8-dirty · 2026-10-26 · Läs på engelska

Guards

Vad som är tillåtet i guards följer de fastlåsta OTP 29-reglerna i erl_internal/erl_lint; det härleds aldrig från registreringen i runtime. Varje operand kontrolleras, även onåbara. En guard lyckas endast när det slutliga värdet är atomen true.

Kontrollflöde

OperatorSemantik
A andalso BA måste vara booleskt; false → false; annars returneras B som vilken term som helst
A orelse BA måste vara booleskt; true → true; annars returneras B
and, or, xorBåda operanderna utvärderas i ordning, båda booleska
not ABoolesk negation

true andalso 7 returnerar 7 i en kropp och misslyckas som slutligt guard-test; (true andalso 7) =:= 7 lyckas. Ett nått fel inuti ett nästlat uttryck avvisar hela alternativet: hd([]) orelse true misslyckas, hd([]); true lyckas. I kroppar ger felaktiga strikta operander badarg och en felaktig lat vänster operand ger {badarg, Value}, som i OTP.

Katalog

guards.tsv listar alla 81 guard-signaturer från de fastlåsta tabellerna guard_bif, new_type_test, old_type_test, arith_op, bool_op och comp_op, och ett test kräver exakt mängdlikhet med uppströms. Granskningsmanifestet mappar var och en till resolver, sänkning (lowering) och ägare i runtime. Alla 81 är implementerade: self() är den anropande processens pid, node() och node/1 för en pid, referens eller port är nonode@nohost (det finns en nod; alla andra argument till node/1 får guarden att misslyckas, badarg i en kropp). Native records i guards: is_record/1,2,3 och fältåtkomst som i native records.

Upplösning

Begränsningar hos orakeln

Installerad OTP 29.1.1 kraschar i SSA-konverteringen för vissa orelaterade moderna importer bakom äldre skalära alias; Clause avvisar den obehöriga ägaren explicit. OTP:s laddare avvisar också en guard med en enorm literal record-aritet trots att lint godtar den; för det fallet finns endast semantiska belägg.