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

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

Зразки, клаузи та зіставлення в тілі

Голови клауз функцій, зіставлення в тілі, клаузи case і guard у if виконуються для кожного допущеного виду термів (терми). Допустимість і доступність перевіряються окремо: недійсний Erlang є семантичною помилкою навіть у недосяжному коді; допустимий код, якому потрібна відсутня можливість, отримує діагностику можливості; невідповідність під час виконання ніколи не є помилкою компілятора.

КонтекстСтан
Голови функцій + guardРеалізовано; вичерпання викликає error:function_clause
Зіставлення та послідовності в тілі, begin/endРеалізовано; невдача викликає error:{badmatch, RHS}
Клаузи case + guardРеалізовано; вичерпання викликає error:{case_clause, Value}
Клаузи guard в ifРеалізовано; вичерпання викликає error:if_clause
maybe з ?= і клаузами elseРеалізовано; невдалий ?= повертає своє значення або вибирає клаузу else, вичерпання яких викликає error:{else_clause, Value}; потребує можливості maybe_expr (препроцесор)
Comprehension для списків, binary і mapРеалізовано (нижче)
catch ExprРеалізовано; без зразків (ABI)
try, клаузи of і catchРеалізовано; вичерпання of викликає error:{try_clause, Value}, незіставлені винятки викидаються повторно, а after виконується на кожному шляху (ABI); Class:Reason:Stack зв'язує трасування стека
Клаузи funМожливість (F18)
receiveМожливість (F22/F25)

Comprehension

[T1, ..., Tn || Q1, ..., Qm], << T || Q1, ... >> і #{K => V, ... || Q1, ... } дотримуються OTP 29:

Кожен генератор — це цикл у тілі функції, курсор входу якого (решта списку чи bitstring або map і позиція) зберігається в слотах термів фрейму; створені елементи накопичуються в зворотному порядку в іншому слоті терма і перетворюються на список, з'єднаний bitstring або map один раз наприкінці, тож довгі входи потребують сталого нативного стека і стека процесу.

Форми зразків

ФормаПравилоВідхилення
_Ніколи не зв'язує; входження незалежніЧитання _ — семантична помилка
Name, _Name, повториОдноразове присвоєння; повтори вимагають точної рівності (1 ≠ 1.0)Читання незв'язаної/небезпечної змінної — семантична помилка; нерівність — невідповідність
P1 = P2, дужкиОбидва обмежують те саме значення; без зв'язувань ключів/розмірів між сусідамиНедопустима залежність між сусідами — семантична помилка
Атоми, цілі числа, символи, числа з рухомою комоюТочна рівність; знаковий нуль розрізняєтьсяНевідповідність
Константна арифметикаОператори зразків OTP згортаються точно; 1 div 0 і не-константи відхиляютьсяСемантична помилка
Кортежі, списки, неправильні хвости, рядкиТочна арність і форма cons/nil; рядки є спискамиНевідповідність
"prefix" ++ TailЛише буквальний рядок або буквальний список цілих чисел як префіксЗмінний префікс — семантична помилка
#{K := P}Лише :=; додаткові ключі дозволено; #{} перевіряє тип; ключі — вирази guard над вхідними зв'язуваннями=>, незв'язаний ключ — семантична помилка; відсутній ключ — невідповідність
BitstringПеревірені тип/розмір/одиниця; раніші сегменти можуть задавати розмір пізніших; хвіст без розміру останнійНедійсний специфікатор — семантична помилка; закороткі дані — невідповідність
Кортежні record #r{f = P}, #r.fРозгортаються в обмеження кортежу; пропущені поля не обмежуютьсяНевідомий record/поле — семантична помилка
Локальні native records #r{f = P}Record цього модуля з назвою r, потім кожне перелічене поле (відсутнє поле дає невдачу)Невідомий record — семантична помилка
Кваліфіковані/імпортовані native records #m:r{f = P}Record модуля m з назвою r; експортований, якщо перелічено поле; потім кожне полеЖодного під час компіляції
Анонімні record #_{f = P}Будь-який native record; експортований або визначений у цьому модулі, якщо перелічено поле#_{...} як вираз — помилка
Виклики, змінна арифметика, інші виразиНе є зразкамиСемантична помилка

Області видимості

Ключі map і розміри binary читають вхідне середовище, а не сусідів: #{K := V} = #{key := K} і <<X:N>> = <<N:8>> не можуть зв'язати власний ключ або розмір. Усередині одного binary розмір може читати раніші сегменти: <<N:8, X:N>> допустимо; {N, <<X:N>>} вимагає, щоб N було зв'язано заздалегідь. Неправильна константна арифметика в ключі чи розмірі допустима і дає невдачу під час зіставлення.

Перевірка binary відхиляє сегменти з вкладеними контейнерами/псевдонімами, конфліктні модифікатори, неправильні діапазони одиниць, одиницю без розміру для типових integer/float, недійсні розмір/одиницю UTF, типізовані рядкові літерали або літерали з розміром і незавершальні сегменти binary без розміру.

Виконання

Обмеження

Нормалізація зразків використовує спільний із модулем семантичний бюджет у 1 000 000 одиниць (ціле число коштує приблизно стільки, скільки в нього десяткових цифр); константа понад межу цілих чисел у 4 194 240 біт є illegal pattern, як в OTP (терми). Кожен план зіставлення має стелю в 100 000 одиниць роботи. Парсер окремо обмежує вкладеність до 256 (жорстка стеля — 512).