Clause
← Уся документація

Перекладено з англійського оригіналу · 1e3a39c8-dirty · 2026-10-26 · Читати англійською

Guards

Допустимість guards відповідає зафіксованим правилам OTP 29 erl_internal/erl_lint; вона ніколи не виводиться з реєстрації в runtime. Перевіряється кожен операнд, включно з недосяжними. Guard успішний лише тоді, коли кінцеве значення — атом true.

Потік керування

ОператорСемантика
A andalso BA має бути булевим; false → false; інакше повертає B як будь-який терм
A orelse BA має бути булевим; true → true; інакше повертає B
and, or, xorОбидва операнди обчислюються по черзі, обидва булеві
not AБулеве заперечення

true andalso 7 повертає 7 у тілі та не проходить як кінцева перевірка guard; (true andalso 7) =:= 7 успішне. Досягнута помилка всередині вкладеного виразу відхиляє всю альтернативу: hd([]) orelse true не проходить, hd([]); true успішне. У тілах некоректні строгі операнди спричиняють badarg, а некоректний лівий операнд лінивого оператора спричиняє {badarg, Value}, як в OTP.

Каталог

guards.tsv перелічує всі 81 сигнатуру guards із зафіксованих таблиць guard_bif, new_type_test, old_type_test, arith_op, bool_op і comp_op, а тест вимагає точної рівності множин з upstream. Маніфест аудиту зіставляє кожну з них із власником у резолвері, пониженні та runtime. Усі 81 реалізовано: self() — це pid процесу, що викликає, node() і node/1 для pid, посилання чи порту дорівнюють nonode@nohost (вузол один; будь-який інший аргумент node/1 провалює guard, а в тілі дає badarg). Native records у guards: is_record/1,2,3 і доступ до полів, як у native records.

Розв'язання імен

Обмеження оракула

Встановлений OTP 29.1.1 аварійно завершується під час перетворення в SSA для деяких сторонніх сучасних імпортів за застарілими скалярними псевдонімами; Clause явно відхиляє такого неавторизованого власника. Завантажувач OTP також відхиляє guard з величезною літеральною арністю record, хоча lint її приймає; для цього випадку є лише семантичні докази.