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

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

Відмінності від Erlang/OTP

Поведінка, що спостерігається, у якій Clause свідомо відрізняється від зафіксованого OTP 29 (maint-29, див. otp-reference.md). Кожен запис посилається на контракт, якому він належить. Запис видаляють, щойно відмінність усунуто. Ще не реалізовані можливості (про які повідомляється як notimpl) тут не наведено; див. features.md і план.

Map

ВідмінністьOTPClauseВласник
Порядок генератора map (K := V <- M)Пласкі map (до 32 ключів) перебираються в порядку ключів, але атомні ключі — в порядку таблиці атомів, який різниться між запусками VM; більші map — у порядку хешівЗавжди канонічний порядок ключів (порядок термів)зразки
Вміст bad_generators для генератора map у zip-групіЙого ітератор: ланцюжок {K, V, Next}, що закінчується none, у порядку OTPТой самий ланцюжок, побудований у канонічному порядку ключівзразки
Друк map (erlang:display/1, ~w, ~p)Порядок внутрішнього розміщення (порядок таблиці атомів для атомних ключів, порядок хешів понад 32 ключі)Порядок ключів map, як ~kw в OTPтерми
Друк native record (erlang:display/1)Поля в порядку індексів таблиці атомівПорядок визначення, як ~wnative records
== між native record, поля яких відрізняються лише як ціле число/число з рухомою комоюКомпілятор може згорнути його до =:= (false)Числове порівняння (true)native records
Друк локального fun (#Fun<M.Index.Uniq>)Індекс із нумерації лямбд компілятора, Uniq — хеш коду модуляІндекс серед локальних fun модуля в порядку вихідного коду, Uniq завжди 0fun
Порядок двох локальних fun одного модуляЗа індексом OTPЗа індексом у порядку вихідного коду, тож fun різних функцій можуть упорядковуватися інакшеfun
Імена анонімних fun у трасуваннях стека (-f/1-fun-N-)N з нумерації компілятораN лічить fun функції f/1 у порядку вихідного кодуfun
Анонімний fun у значенні за замовчуванням поля recordКожне місце конструювання розгортає власну копію: fun із двох місць нерівніОдин fun для значення за замовчуванням: fun з будь-якого місця конструювання рівніfun
Порядок захоплених значень fun, створених усередині comprehensionВільні змінні згенерованої функції comprehensionПорядок визначення в охопній функції; помітно лише при порівнянні двох таких funfun

Pid, посилання і процеси

ВідмінністьOTPClauseВласник
Номери pidПерший процес користувача — приблизно <0.80.0>; номери повторно використовуються після переповнення таблиці pidПерший процес — <0.1.0>; номери беруться з однієї послідовності й ніколи не використовуються повторнотерми
Код після spawn(Fun) для fun іншої арностіАналіз типів компілятора може вважати код після виклику недосяжним і відкинути його, тож викликач одразу повертає pidВикликач продовжує роботу; завершується з помилкою лише новий процес, з {badarity, {Fun, []}}процеси
Форматування великого терма (io:format/1,2)Виконується в коді Erlang (io_lib) і в group leader, тож процес може бути витіснений під час форматуванняВиконується до кінця в одному виклику вбудованої функції; інші процеси чекаютьвбудовані функції
Прапорці process_flag/2trap_exit, priority, message_queue_data, min_heap_size та іншіЛише trap_exit; будь-який інший прапорець викликає badargпроцеси
Порядок звітів про помилки процесів, що аварійно завершуються одночасноПорядок loggerПорядок, у якому їх завершують їхні робочі потокипроцеси
Сигнали процесу, що виконується на іншому планувальникуСтавляться в чергу сигналів і обробляються пізніше, поки відправник продовжує роботуВідправник чекає, доки закінчиться квант часу цілі, і тоді діє одразу; помітно лише за часомпроцеси
list_to_port/1 для номера, який ніколи не видававсяПовертає терм портуbadarg: допускаються лише порти, відкриті цією програмоюпорти
Значення port_info/1,2id — індекс таблиці; memory, queue_size, locking описують драйверid — номер порту; memory і queue_size дорівнюють 0; locking — port_levelпорти
Запис у файл, відкритий лише для читання{error, eacces} у Windows, {error, ebadf} деінде{error, ebadf} скрізьпорти
io:get_line, io:get_chars і file:read/2 у режимі списку на не-ASCII введенніСимволи декодуються відповідно до кодування пристроюОдин елемент списку на байтпорти
Результат os:cmd/1Символи Unicode, декодовані з виводуБайти виводупорти
Порожні аргументи {spawn_executable, F} у WindowsВідкидаються з командного рядкаПередаються як ""порти
{exit_status, S} і eof запущеної програмиПорядок не визначено, exit_status може надійти раніше за останні даніПісля всіх даних, перед eofпорти
Зайняті портиПорт із надто великою чергою виводу призупиняє відправників; force у port_command/3 працює з драйверами, які це дозволяютьВивід ніколи не призупиняє; force викликає notsup на кожному драйверіпорти
{active, N} для сокетівЦіле N лічить повідомлення до {tcp_passive, S}exit(badarg); лише true, false і onceпорти
Параметри налаштування сокетів (nodelay, keepalive, send_timeout, delay_send, буфери)Застосовуються; інші параметри inet (header, {packet, line}, http, ...) працюютьПерелічені параметри налаштування приймаються, але не застосовуються; інші параметри — exit(badarg)порти
Причини помилок сокетівКожна причина POSIX, про яку повідомляє системаПоширені (econnrefused, eaddrinuse, econnreset, etimedout, ...); інші — eioпорти
Введення порту, коли під'єднаний процес утримує 1 024 повідомлення і може виконуватисяПродовжує читати й доставлятиПрипиняє доставку, доки не закінчиться квант часу процесу; понад 64 KiB утримуваних даних припиняє читання, тож програма, що пише, блокуєтьсяпорти
gen_tcp:close/1 із виводом у черзіЧекає до межі linger/send_timeout, поки вивід буде відправленоПовертається одразу; потік вводу-виводу надсилає вивід із черги, потім закриваєпорти
Типи monitor/2process, port, time_offsetprocess і port; time_offset викликає badarg (зміщення часу не змінюється)процеси
exit/2, exit_signal/2 до посиланняНадсилає псевдоніму процесу, якщо посилання активнеНічого (псевдонімів немає)процеси
Номери посиланьПоєднують ідентифікатор планувальника і лічильники окремих планувальників (#Ref<0.178111994.4235460610.214105>)Один лічильник на всю програму (#Ref<0.0.0.1>), тож посилання впорядковані за часом створеннятерми

Помилки, трасування стека і звіти

ВідмінністьOTPClauseВласник
Розташування в трасуванні стека[{file, F}, {line, L}], error_info для error/3Завжди []; без error_infoABI
Верхній фрейм function_clauseСписок аргументівАрністьABI
Верхній фрейм undef{M, F, Args, []} відсутньої функціїФрейм функції, що викликаєfun
Фрейми BIF/операторів, що завершилися з помилкоюПрисутні ({erlang, '+', Args, ...})Відсутні; нічого нижче за вхідну функціюABI
Таблиця атомів заповнена (list_to_atom/1)Емулятор аварійно зупиняється (no more index entries in atom_tab) і записує crash dumpclau: runtime failure: entry call failed: resource_limit, код виходу 70вбудовані функції
list_to_integer/1,2 із символами понад 255Його перші цифри використовують лише молодший байт кожного символу ([16#131] дає 1)badargвбудовані функції
erlang:function_exported/3 для BIFTrue для кожного BIF емулятораTrue лише для вбудованих функцій, які надає цей runtimeвбудовані функції
Звіти про помилки аварійно завершених процесівНадсилаються до logger, записуються пізніше його обробником за замовчуванням (у стандартний вивід під erl, часто губляться, коли escript зупиняється раніше)Записуються в stderr, коли процес завершується, до будь-якого подальшого виводупроцеси
Виклики функцій, що ніколи не повертаютьсяКомпілюються як хвостові виклики (викликача немає в трасуванні)Звичайні виклики (викликач присутній)ABI
Пам'ять хоста вичерпаноЕмулятор повідомляє, що не може виділити пам'ять, записує crash dump і зупиняєтьсяclau: runtime failure: entry call failed: out_of_memory, код виходу 70, без dumpкупа runtime
Обмеження пам'яті процесуmax_heap_size (у словах, купа і стек) вбиває процес із причиною killed і журналює звіт про помилку--max-heap / --max-stack (у байтах) і загальний для runtime --max-memory завершують процес, що запитує пам'ять, як resource_limit: clau: runtime failure: entry call failed: resource_limit, код виходу 70купа runtime
Аргументи програмиescript передає кожен аргумент у main/1; прапорці емулятора (+t) беруться з %%! або ERL_FLAGSПочаткові параметри runtime (--max-atoms, --max-heap, --max-stack, --max-memory, --args-file, --) вилучаються першими; CLAUSE_FLAGS містить ті самі параметривиконувані файли
Неперехоплений виняток у звичайному вхідному модуліescript завершується з кодом 127Завершується з кодом 1 і одним рядком uncaught exception <class>: <reason> (вихідні файли escript зберігають 127)виконувані файли
Діагностика компілятораФормулювання erl_lint (variable 'X' is unbound) і попередженняВласні формулювання (unbound variable X); попередження lint з OTP здебільшого не видаються (також для невідомих полів native record у доступі, оновленні та зразках)семантика

Граничні випадки мови

ВідмінністьOTPClauseВласник
Цілочисловий сегмент, ширший за межу цілих чисел, зі значенням понад неї (<<V:4194241>> з усіх одиниць)JIT для x86 зіставляє з недійсним термом; його використання призводить до аварії VMНемає збігутерми
Zip-група, у якій нестрогий і строгий генератори мають спільну зміннуПеревірка пропуску зберігає змінні строгих зразків у нестрогих зразкахВідхилений крок пропускається щоразу, коли строгі зразки збігаються самі по собізразки
Виклик зовнішнього fun, M:F(Args) або apply/3 модуля поза програмоюЗавантажує модуль зі шляху коду, undef, якщо його немаєundef; бібліотечні модулі входять до програми лише тоді, коли вона називає їх літеральним атомомfun, бібліотека
lists і mapsПовні модулі; maps:keys/1, values/1, to_list/1, fold/3 дотримуються внутрішнього порядку map (порядок таблиці атомів для атомних ключів, порядок хешів понад 32 ключі)Підмножина бібліотеки; функції map дотримуються порядку ключівбібліотека
Файли без #!, передані як escriptescript file.erl пропускає перший рядокКомпілюються як звичайні модулівиконувані файли
Попередньо скомпільовані beam та архівні escriptВиконуютьсяНе підтримуютьсявиконувані файли
-spec, типи якого не мають спільного значення з виведеним результатом, вхідною областю визначення чи аргументами викликуКомпілюється; Dialyzer може попередитиПомилка компіляції із зазначенням оголошених і виведених типівсемантичний аналіз

io

ВідмінністьOTPClauseВласник
Керувальні послідовності ~e ~f ~g ~x ~X ~+ ~# ~W ~P, модифікатор KФорматуютьсяbadargio
~p для контейнерів із вкладеністю понад 256 рівнівДрукуютьсяsystem_limitio
Ширина полів і точність ~ts з комбінованими символами або \r\nЛічать кластери графемЛічать кодові точкиio
Від'ємна точність або кількість заповнення (~.*c з -1)Нескінченний циклbadargio
Функції io, крім format/1,2, put_chars/1Існуютьunknown module ioio