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

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

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

Голови клауз функцій, зіставлення в тілі, клаузи 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Реалізовано; вичерпання викликає error:function_clause (fun)
Клаузи receive + guardРеалізовано; незіставлені повідомлення лишаються в поштовій скриньці, after виконується за тайм-аутом (процеси)

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 одиниць, або 32 на вираз для більших модулів) (ціле число коштує приблизно стільки, скільки в нього десяткових цифр); константа понад межу цілих чисел у 4 194 240 біт є illegal pattern, як в OTP (терми). Кожен план зіставлення має стелю в 100 000 одиниць роботи. Парсер окремо обмежує вкладеність до 256 (жорстка стеля — 512).