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

Перекладено з англійського оригіналу · 06042fa · 2026-10-09 · Читати англійською

Guard

Допустимість guard дотримується зафіксованих правил erl_internal/erl_lint з OTP 29; вона ніколи не виводиться з реєстрації в 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 сигнатуру guard із зафіксованих таблиць guard_bif, new_type_test, old_type_test, arith_op, bool_op і comp_op, а тест вимагає точної рівності множин з upstream. Маніфест аудиту зіставляє кожну з власником у розв'язувачі, пониженні та runtime. Усі 81 реалізовано (залежні від ідентичності self/0, node/0,1 і нативний is_record/1 — починаючи з step 52 плану): self() — pid процесу, що викликає, node() і node/1 для pid, посилання або порту дорівнюють nonode@nohost (вузол лише один; будь-який інший аргумент node/1 робить guard невдалим, а в тілі дає badarg), а is_record/1 перевіряє, чи це native record. is_record/2 з назвою локального native record перевіряє модуль і назву; is_record/3 з атомом як третім аргументом перевіряє модуль і назву native record; доступ до нативного поля робить guard невдалим за будь-якої невідповідності.

Розв'язання

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

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