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

Англійський оригінал змінився після перекладу, тож частина тексту може бути застарілою. Читати англійською

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

Модулі бібліотеки

Clause постачає власні версії модулів OTP, які викликають програми, написані на Erlang за документованою поведінкою OTP (не скопійовані з вихідних кодів OTP) поверх вбудованих функцій runtime, і компілює їх разом із програмами, що їх використовують.

Вміст

Кожен наданий модуль експортує повний список OTP 29 для свого імені; його інвентар <module>.terms (файли) записує, які функції реалізовано, а які є заглушками.

МодульВміст
listsПоширені функції; функції даних, як-от sublist/2,3, flatten/1,2, sort/1, usort/1, keymember/3, zip/2,3, merge/2, — вбудовані функції runtime; кожну документовану функцію реалізовано (модуль lists)
mapsКожна документована функція; get/3, merge/2, intersect/2, with/2, ... — вбудовані функції runtime, функції з fun написано Erlang (модуль maps)
ordsets, orddict, proplistsКожна документована функція; обходи списків — вбудовані функції runtime, функції з fun написано Erlang (колекції)
calendarКожна документована функція; григоріанська арифметика — вбудовані функції runtime, локальний час і RFC 3339 написано Erlang (календар)
proc_lib, sysКожна документована функція: створення процесів із предками й початковими викликами, синхронні запуски (init_ack, init_fail), мітки, stop/1,3, звіти про збої та їхній текст; протокол системних повідомлень і параметри налагодження (trace, log, statistics, log_to_file, встановлені fun) з формами списків налагодження OTP
gen_server, gen_statem, gen_event, gen_fsm, genКожна документована функція на Erlang поверх proc_lib і sys, з повідомленнями OTP ('$gen_call' з тегами псевдонімів, '$gen_cast', ...), результатами й діями зворотних викликів, колекціями ідентифікаторів запитів, термами помилок і текстами звітів; gen містить спільну частину
supervisor, supervisor_bridgeКожна документована функція: специфікації дочірніх процесів і помилки OTP, стратегії, інтенсивність перезапусків, правила завершення, дочірні процеси simple_one_for_one й автоматичне завершення, як gen_server
logger, logger_formatter, logger_std_h, logger_filters, logger_handlerКожна документована функція на Erlang: основна конфігурація, конфігурація обробників і проксі з перевірками й термами помилок OTP, рівні модулів, метадані процесів, фільтри, макроси ?LOG_* з kernel/include/logger.hrl, шаблони форматувальника й застарілий заголовок, logger_std_h для пристроїв і файлів із ротацією, стисненням і filesync/1, logger_disk_log_h для дискових журналів halt і wrap (обидва поверх clause_logger_h, спільні параметри й перевірки обробників OTP). Сервер logger — це clause_logger з Clause, який запускається при першому використанні зі стандартним обробником OTP на standard_io (змінна середовища CLAUSE_LOGGER_TYPE=standard_error переносить його на стандартний потік помилок, як робить засіб запуску еталонних тестів для відповідності еталонам, створеним з обробником OTP на цьому потоці); рівні застосунків потребують application
disk_log, wrap_log_reader, clause_disk_log, clause_disk_log_serverКожна документована функція на Erlang: журнали halt, wrap і rotate, внутрішні й зовнішні, з форматами файлів OTP (заголовки журналів, кадри елементів із MD5 для великих елементів, файли індексу й розміру wrap, архіви rotate), тож файли побайтово збігаються з OTP; окремий процес для кожного журналу з власниками, користувачами, сповіщеннями, блокуванням із чергою запитів, випереджальним журналюванням, кешем запису зі скиданням за розміром і таймером, відновленням, блоками лише для читання з підрахунком пошкоджених байтів; сервер реєстру disk_log_server з іменованими таблицями disk_log_names і disk_log_pids; wrap_log_reader поверх того самого засобу читання блоків
error_logger, error_logger_file_h, log_mf_hКожна документована функція: повідомлення й звіти як події журналу з метаданими error_logger OTP, обробники звітів у менеджері подій error_logger, який отримує дані від обробника журналу error_logger, logfile/1 зі старим текстом звітів, файли wrap з індексом і форматом записів OTP
pg, data_publisherКожна документована функція: області як сервери data_publisher з таблицями ETS OTP, приєднання, виходи, учасники, що завершуються, монітори областей і груп; область не має однорангових вузлів
global, global_groupКожна документована функція як на нерозподіленому вузлі: імена (також {global, Name} у поведінках), блокування й транзакції поверх global_name_server, що запускається при першому використанні; global_group без груп; механізм блокування й внутрішні механізми розподілу відхилено
rpc, erpcКожна документована функція: виклики цього вузла виконуються у створених процесах (rex запускається при першому використанні) з результатами й помилками OTP; інші вузли недоступні ({badrpc, nodedown}, {erpc, noconnection})
net_adm, net_kernel, auth, seq_traceВідповіді OTP для неактивного вузла (pang, ignored, #{started => no}, nocookie); net_kernel:start/1,2 і внутрішні механізми розподілу відхилено; seq_trace зберігає токен кожного процесу без трасування
trace, erl_tracerТрасування не підтримується: кожна функція trace і стандартний трасувальник erl_tracer (enabled/3, trace/5) породжують notsup, як і функції трасування erlang (модуль erlang); erl_tracer:behaviour_info/1 перелічує зворотні виклики OTP
error_handlerФункції невизначених викликів, які можна викликати безпосередньо; runtime сам породжує undef і ніколи їх не викликає; breakpoint/3 відхилено (немає інтерпретатора)
timerКожна документована функція без сервера таймерів OTP: відкладені надсилання локальним pid — це erlang:send_after/3, кожен інший таймер — окремий процес, доступний через псевдонім у його TRef; перетворення й now_diff/2 — вбудовані функції runtime (таймер)
filelib, clause_filelibКожна документована функція: шаблони імен компілюються й зіставляються вбудованими функціями runtime за правилами, особливостями й помилками OTP, обхід каталогів, запити, ensure_dir/1, ensure_path/1, fold_files/5,6, find_file/2,3, find_source/1,2,3 (source_search_rules з kernel або стандартні правила OTP) і safe_relative_path/2 на Erlang; також недокументовані форми, що приймають модуль (file, erl_prim_loader чи інший), compile_wildcard/1 (допоміжний засіб налагодження OTP) — заглушка (filelib)
file_sorterКожна документована функція на Erlang: серії OTP (size байтів, відсортованих у пам'яті), злиття (по no_files тимчасових файлів, блоки 16 KiB, потоки впорядковано за їхніми буферизованими об'єктами й номерами файлів) і перевірки відтворено крок за кроком, тож терми, які порівнюються як рівні, виводяться й зберігаються після unique як в OTP; формати binary_term, binary, term і fun, header, compressed (через шар gzip модуля file), tmpdir, вхідні й вихідні fun, терми помилок OTP
zipКожна документована функція на Erlang із побайтовим відтворенням структури архівів OTP (локальні й центральні заголовки, створені UNIX 6.1, додаткові поля розширених часових позначок і UNIX uid/gid, zip64 понад 4 GiB, блоки deflate по 8 KiB з повними скиданнями через zlib), тож архіви збігаються з OTP; файли або binary на вході й виході через вхідні й вихідні fun OTP, фільтри, cwd, keep_old_files, skip_directories, foldl/3, архіви zip_open/1,2, які обслуговує зв'язаний процес, t/1, tt/1, терми помилок OTP; record з stdlib/include/zip.hrl
erl_tarКожна документована функція на Erlang із побайтовим відтворенням правил формату OTP: заголовки USTAR, довгі імена розділяються з виділенням префікса або переносяться в розширені заголовки pax (як і довгі чи не-ASCII імена, посилання та імена власників і числа, що не вміщуються у вісімковий формат), читання архівів v7, GNU (довгі імена й посилання, розріджені файли), STAR, USTAR і pax з особливостями OTP (поля з основою 256, час pax), compressed через шар gzip модуля file, binary читаються як файли ram, пристрої, користувацькі fun I/O init/3, max_size, keep_old_files, files, cwd, verbose, перевірки небезпечних шляхів, терми помилок OTP і format_error/1
zstd, clause_zstdКожна документована функція: одноразове й потокове стиснення та розпакування, параметри, словники (сирі чи за посиланням), заголовки кадрів та ідентифікатори словників, на Erlang поверх вбудованих функцій runtime, які зберігають контексти libzstd 1.5.7, як NIF в OTP (zstd); file:open/2 приймає {zstd, Options}
beam_lib, erl_abstract_codeКожна документована функція на Erlang з обробкою блоків як в OTP: обхід IFF з помилками OTP, таблиці атомів в обох кодуваннях, таблиці символів, атрибути, інформація про компіляцію, літерали, налагоджувальна інформація й абстрактний код через бекенд erl_abstract_code, документація (record з kernel/include/eep48.hrl), MD5 значущих блоків, порівняння й очищення файлів, каталогів і випусків, beam зі стисненням gzip, build_module/1 і сервер криптографічних ключів із розшифруванням налагоджувальної інформації (через crypto, що викликається динамічно: скомпонуйте його з --with-crypto)
io_ansiКожна документована функція на Erlang: послідовності віртуального термінала OTP 29 як вбудовані послідовності ANSI, які OTP використовує без terminfo (запити terminfo відповідають {error, enotsup}), format/1,2,3 і render/1,2 поверх io_lib, fwrite/1,2,3,4 як запити put_ansi, які відтворює сервер стандартного вводу, scan/1 і enabled/0,1 з ознаки термінала пристрою (модуль io)
win32regКожна документована функція: розбір ключів OTP (корені, абсолютні, відносні шляхи й ..), поточний ключ, цілі, рядкові й binary значення, переліки й видалення поверх драйвера реєстру Windows (реєстр); на інших платформах {error, enotsup}, як в OTP
argparse, clause_argparseКожна функція: валідація з помилками OTP, розбір (параметри, прапорці, nargs, дії, типи з варіантами вибору, обмеженнями й регулярними виразами, власні типи, підкоманди, префікси, типові значення) з map аргументів і помилками OTP, help/1,2 з оформленням і шаблонами OTP, run/3 з усіма формами обробників, як вбудовані функції runtime, що просять Erlang викликати fun (argparse); без progname — власне ім'я програми
escriptcreate/2 і extract/2 зі структурою секцій і читанням заголовків як в OTP (shebang, коментар і рядки аргументів емулятора; тіла з вихідним кодом, beam і архівами через zip); script_name/0 — шлях виконуваного файлу; виконання escript (start/0,1, parse_file/1) відхилено
filenameКожна документована функція за правилами Unix і Windows OTP для хоста; обходи імен — вбудовані функції runtime, absname/1,2 і basedir/2,3 (з HOME, змінних XDG і APPDATA) написано Erlang (імена файлів)
uri_stringКожна документована функція — вбудована функція runtime: розбір RFC 3986 з фрагментами помилок OTP, повторне складання, нормалізація, розв’язання, відсоткове кодування й запити form-urlencoded (uri_string)
jsonКожна документована функція з iodata, помилками й порядком зворотних викликів OTP; decode/1, encode/1, format/1,2 і екранування binary — вбудовані функції runtime, кодувальники й форматувальники з fun та декодувальники зі зворотними викликами написано Erlang (кодування)
rand, randomКожна документована функція зі станами й послідовностями OTP; алгоритми OTP виконуються як вбудовані функції runtime, під’єднувані генератори — в Erlang (випадкові числа)
stringКожна документована функція — вбудована функція runtime, що обходить chardata як string.erl OTP, зберігаючи форми результатів OTP (рядки)
base64Кожна документована функція — вбудована функція runtime (кодування)
arrayКожна документована функція над record OTP 29; операції з record — вбудовані функції runtime, згортки й mapfold написано Erlang (колекції)
gb_trees, gb_sets, queueКожна документована функція над формами дерев і черг OTP; операції без fun — вбудовані функції runtime (колекції)
dict, setsКожна документована функція над record OTP (множини версії 1) і map (версія 2); операції без fun — вбудовані функції runtime (колекції)
ioget_line/1,2, get_chars/2,3 (сервер стандартного вводу або відкритий файл), fread/2,3 (запит get_until поверх io_lib:fread/3), read/1..4, scan_erl_exprs/1..4, scan_erl_form/1..4, parse_erl_exprs/1..4, parse_erl_form/1..4 (запити get_until поверх erl_scan:tokens/3,4, розібрані erl_parse), request/1,2, requests/1,2 (протокол вводу-виводу OTP, файли), getopts/0,1, setopts/1,2, columns/0,1, rows/0,1 (розмір термінала через вбудовані функції clause_io), get_password/0,1, write/1,2; format/1,2,3, fwrite/1,2,3, put_chars/1,2 і nl/0,1 є вбудованими функціями runtime (io)
io_libФункції виведення, перевірки, збирання даних, рушій форматування, форматувальник (print/1,4, ~p, chars_limit) і сканер (fread/2,3) — вбудовані функції runtime з формами глибоких списків OTP, fun maps_order сортують ключі в clause_io_lib; get_until, format_prompt і write/3 написано Erlang (io_lib)
sofs, clause_sofsКожна функція; операції з даними — вбудовані функції runtime, функції, що приймають fun, і перетворення digraph написано Erlang (множини множин)
etsТаблиці, читання, запис, обходи й оновлення як вбудовані функції runtime поверх таблиць runtime; foldl/3, foldr/3, i/0..3 і fun2ms/1 написано Erlang; специфікації зіставлення (сімейства select, match, match_spec) як вбудовані функції поверх інтерпретатора runtime, match_spec_run/2, test_ms/2, repair_continuation/2, match_delete/2 і init_table/2 написано Erlang; файли таблиць (tab2file/2,3, file2tab/1,2, tabfile_info/1) на Erlang поверх file і clause_disk_log; to_dets/2 і from_dets/2 на Erlang поверх dets; table/1,2 на Erlang поверх qlc:table/2 (ets)
graphКожна функція над record OTP; запити й обходи — вбудовані функції runtime, оновлення написано Erlang (graph)
digraph, digraph_utilsКожна функція над record OTP із трьома таблицями; оновлення й читання на Erlang поверх ets, пошуки шляхів і обходи digraph_utils — вбудовані функції runtime, що читають таблиці, subgraph/2,3 і condensation/1 написано Erlang (digraph)
dets, clause_detsКожна документована функція: серверні й табличні процеси OTP на Erlang поверх рушія C++ для формату файлів OTP версії 9, файли побайтово збігаються з записаними OTP; table/1,2 на Erlang поверх qlc:table/2 (dets)
ms_transformКожна функція на Erlang поверх абстрактного формату: parse_transform/2 перетворює літеральні fun, передані ets:fun2ms/1 і dbg:fun2ms/1 у формах модуля, transform_from_shell/3 — гілки fun оболонки, зі специфікаціями зіставлення, попередженнями про затінення й кодами помилок OTP. Модуль, що використовує перетворення під час компіляції, як і раніше запускає ms_transform OTP хоста (перетворення розбору)
qlc_pt, clause_qlc_ptПеретворення розбору qlc під час виконання (недокументоване в OTP): transform_expression/2, transform_from_evaluator/2 і parse_transform/2 як вбудовані функції runtime зі згенерованим кодом запитів, повідомленнями й анотаціями OTP; ms_transform виконується на Erlang за запитом (qlc_pt). Скомпільовані модулі, що підключають qlc.hrl, як і раніше використовують перетворення OTP хоста (перетворення розбору)
qlcКожна функція на Erlang, написана за документацією OTP: дескриптори скомпільованих запитів (дескриптори qlc_lc OTP з перетворення), списків, таблиць table/2, append/1,2, sort/1,2 і keysort/2,3; обчислення з пошуком констант, специфікаціями зіставлення, з'єднаннями злиттям і пошуком, cache (ets, list зі скиданням у тимчасові файли), unique, сортуванням file_sorter, курсорами як процесами, info/1,2 поверх erl_pp, string_to_handle/1,2,3 поверх qlc_pt, термами помилок OTP і format_error/1. Дескриптори, таблиці, ключі словника процесу й імена тимчасових файлів — як в OTP. stdlib/include/qlc.hrl задає перетворення qlc, яке виконується на OTP хоста (qlc)
shell, clause_shell, clause_shell_eval, clause_shell_commands, clause_shell_recordsКожна документована функція на Erlang, написана за документацією OTP: інтерактивна оболонка на стандартному вводі (інтерактивна оболонка): запрошення, банер, історія (e/1, v/1, h/0), прив'язки, record (rd, rr, rl, rp, rf) OTP, функції, типи й специфікації, визначені в оболонці, звіти про винятки через erl_error, результати виводяться як в OTP (глибина 30, record), обмежені оболонки, catch_exception/1 і функції налаштувань
shell_default, cКожна функція: команди c з виводом OTP (i/0, regs/0, m/0,1, ls/0,1, flush/0, help/0, ...); компіляція (c/1,2,3, lc/1, nc/1,2), xm/1 і y/1,2 повідомляють про невдалий виклик як OTP без compiler, tools чи parsetools; h/1,2,3 не знаходять документації у скомпонованому коді; команди налагоджувача i повідомляють про відсутній застосунок
edlin, edlin_expandedlin:keymap/0 (розкладка клавіш редактора рядка, що викликає функцію; undefined поза ним); edlin_expand:expand/1,2 на Erlang: доповнення модулів, функцій (арності Mod:, fun Mod:Fun/), BIF, команд оболонки, визначених в оболонці функцій, ключових слів, прив'язок, імен і полів record, ключів map і шляхів файлів, із секціями й застарілими збігами OTP; аргументи виклику пропонуються як заголовки Mod:Fun/Arity (скомпонований код не має специфікацій)
shell_docs, clause_shell_docs_markdownКожна функція на Erlang, написана за документацією OTP: render/2..5, render_type/2..5 і render_callback/2..5 для заданого блока docs_v1 (application/erlang+html, text/markdown перетворюється як в оболонці OTP, інші формати text/ — без змін) з оформленням, перенесенням рядків, маркерами списків і стилями ANSI OTP, normalize/1, validate/1, supported_tags/0; ідентично OTP на 51,249 відтвореннях власних блоків документації OTP 29. Скомпонований код не має власних блоків (code:get_doc/1)
erl_parse, clause_erl_parseКожна функція: parse_form/1, parse_exprs/1, parse_term/1 і parse/1, parse_and_scan/1 yecc поверх парсера runtime з абстрактним форматом і помилками OTP; normalise/1, abstract/1,2, tokens/1,2 і таблиці пріоритетів — вбудовані функції; обходи анотацій і format_error/1 написано Erlang (erl_parse)
erl_eval, clause_erl_evalКожна функція на Erlang поверх абстрактного формату: прив'язки як orddict або map, обробники локальних і нелокальних функцій (оператори, BIF і помилки як виклики erlang:raise/3 проходять через останні), інтерпретовані fun з оточенням OTP, comprehension зі строгими й zip-генераторами, maybe, native record, receive поверх prim_eval; зіставлення зі зразком, сегменти бітового синтаксису й згортання констант — вбудовані функції runtime (erl_eval). exprs/2 і expr/2 перевіряють команду через erl_lint:exprs_opt/3; qlc:q/1,2 для запиту у вигляді list comprehension проходить через qlc:transform_from_evaluator/2 із прихованими локальними викликами, як в OTP
erl_errorКожна функція на Erlang поверх io_lib: format_exception/3,4 і внутрішні форматувальники (format_exception/6,7,8, format_stacktrace/4,5, format_call/4,5, format_fun/1,2) з поясненнями, оформленням, зворотними викликами error_info й параметрами OTP. Власні трасування стека Clause не містять розташувань чи error_info (відмінності), тож їхні звіти не показують ні того, ні іншого
erl_pp, clause_erl_ppКожна функція; друк — вбудована функція runtime (erl_pp): форми, атрибути, типи й специфікації, функції, guard і вирази з оформленням (ширина рядка, відступи, частини рядків, дужки пріоритетів) і параметрами OTP; обробники-перехоплювачі та legalize_vars/1 виконуються тут; ідентично OTP на формах 347 вихідних файлів і тестових наборів OTP, а також на 80 із них з п'ятьма наборами параметрів, включно з перехоплювачами
erl_lint, clause_erl_lintКожна функція; перевірки — вбудовані функції runtime (erl_lint) з помилками, попередженнями, параметрами, порядком і текстами format_error/1 OTP; behaviour_info/1 поведінок викликається тут, а is_guard_test/3 спочатку запитує свій fun про локальні виклики; ідентично OTP на 481 вихідному файлі й тестовому наборі OTP, 474 фрагментах наборів і 816 командних виразах
erl_expand_recordsmodule/2 — вбудована функція runtime (erl_expand_records): record на основі кортежів розгортаються в операції з кортежами, native record та імпортовані native record зберігаються, виклики імпортів і BIF отримують свій модуль, перевірки guard is_record/3 перетворюються на зразки, з параметрами dialyzer, expand_inits і [no_]strict_record_tests; ідентично OTP на формах 347 вихідних файлів і тестових наборів OTP
epp, clause_eppКожна функція на Erlang, крім умов -if, які обчислює вбудована функція (epp): окремий сервер для кожного відкритого вихідного файлу з формами, макросами (аргументи, перевантаження, ??Arg, ?FUNCTION_NAME, попередньо визначені й задані параметром macros), включеннями, умовними директивами, -file, -feature, -error/-warning, файлами документації й помилками OTP; файли читаються цілком і декодуються за коментарем кодування. Ідентично OTP на 1,110 викликах parse_file/scan_file для вихідних файлів і наборів OTP. -include_lib знаходить заголовки лише через шлях включення до появи code:lib_dir/1
erl_scanКожна функція: string/1,2,3 і реентерабельні tokens/3,4 поверх сканера runtime з токенами, анотаціями, параметрами, зворотними викликами й помилками OTP; функції доступу й format_error/1 написано Erlang (erl_scan)
erl_internal, erl_annoКожна функція як вбудована функція runtime: таблиці BIF, guard, перевірок типів і операторів OTP, попередньо визначені функції та анотації (таблиці компілятора)
records, erl_featuresРефлексія native record, визначення під час виконання й скомпільовані визначення зі згорнутими типовими значеннями (native record); можливості OTP 29 і ті, з якими скомпільовано кожен модуль (таблиці компілятора)
binaryКожна функція; replace/3,4 і list_to_bin/1 на Erlang, інші — вбудовані функції runtime (модуль binary)
mathКожна функція як вбудована функція runtime (модуль math)
unicodeКожна функція — вбудована функція runtime: перетворення, bin_is_7bit/1, позначки порядку байтів, форми нормалізації, категорії й властивості ідентифікаторів (модуль unicode)
unicode_utilКожна функція над згенерованими таблицями, обходи chardata — вбудовані функції runtime (unicode_util)
reКожна функція, крім import/1, поверх PCRE2 (модуль re)
fileКожна документована функція: відкриття, читання, запис, позиціювання й закриття файлів (на диску, compressed або в пам'яті з ram), позиційне читання й запис, truncate/1, advise/4, allocate/3, читання й запис цілих файлів, consult/1, eval/1,2, script/1,2 та їхні форми path_ з path_open/3 (файл читається цілком і декодується за коментарем кодування, типово UTF-8, як робить epp:set_encoding/1 у clause_epp, а потім сканується форма за формою з результатами й помилками OTP), інформація про файли та її зміни (write_file_info/2,3, change_*), операції з каталогами поверх файлового драйвера, sendfile/2,5 як резервний поблоковий варіант OTP і format_error/1 (файли)
erl_posix_msgВнутрішній модуль OTP для file:format_error/1: message/1 як вбудована функція runtime (повідомлення POSIX)
gen_tcp, gen_udp, inet, clause_socket, clause_socket_optionsСокети поверх портів-сокетів, з їхніми параметрами, статистикою, станом і переліками (сокети); inet:get_rc/0 з clause_inet_config
socketКожна документована функція на Erlang поверх портів драйвера сокетів (сокети): дескриптори {'$socket', Ref}, що зберігаються процесом і таблицею clause_socket_registry (власники, стани, лічильники, метадані, монітори, переліки), open/bind/listen/accept/connect, send/sendto/sendmsg/sendv/sendfile/sendmmsg, recv/recvfrom/recvmsg/recvmmsg з помилками часткових даних OTP, nowait як повідомлення про завершення у Windows і повідомлення select на інших платформах, cancel/2, імена параметрів і помилки некоректних значень OTP, info/0,1, i/0,1,2, supports/0,1,2; виклики SCTP породжують notsup, а запити інтерфейсів відхиляються, як в OTP на Windows
gen_sctpКожна документована функція: SCTP немає, тож open/0,1,2 відповідають {error, eprotonosupport} після перевірок параметрів OTP, а інші бачать закритий або чужий сокет; error_string/1 містить тексти OTP
inet_res, clause_inet_configКожна документована функція на Erlang: клієнт DNS OTP поверх gen_udp і gen_tcp (повторні спроби, альтернативні сервери імен, EDNS, перехід на TCP при обрізанні, очікування servfail, помилки OTP, списки пошуку, ланцюжки CNAME і hostent) з повідомленнями, які кодує й декодує кодек DNS clause_net (мережеві імена); конфігурація розв'язувача як її завантажує OTP на нерозподіленому вузлі (відсутня у Windows; resolv.conf і файл hosts на інших платформах)
net, clause_netКожна документована функція: пошук хостів, адрес і служб та списки інтерфейсів як вбудовані функції runtime з результатами prim_net, фільтри написано Erlang; без мережевих просторів імен (мережеві імена)
clause_socketВласний модуль Clause: протокол драйвера сокетів, спільний для трьох модулів вище
oscmd/1,2 через порт із протоколом оболонки OTP, max_size і exception_on_failure; запити про оточення, час і версію, find_executable/1,2 і set_signal/2 як вбудовані функції (модуль os)
codeЗапити про завантажені модулі без сервера коду; шлях коду в постійному термі зі змінами шляхів OTP, пошуки lib_dir/priv_dir, where_is_file/1, all_available/0, clash/0; відповіді щодо завантаження для скомпонованого коду (модуль code)
application, application_controllerКожна документована функція: завантаження, ключі, оточення, запуски із залежностями й фазами запуску, зупинки, дозволи й типи перезапуску з помилками й звітами OTP, поверх контролера, який запускається при першому використанні, і clause_application_master (застосунки); обробку випусків, завантаження системи й розподілене керування відхилено
erlangЗгенеровані заглушки кожного експорту erlang OTP 29; вбудовані функції каталогу мають тіла-заповнювачі, nif_error/1,2 мають тіла, інші піднімають {not_implemented, F, A} під час виклику (модуль erlang)
initВідповіді запущеної системи; boot/1, restart/0,1 і make_permanent/2 відхилено (модуль init)
persistent_termКожна функція як вбудована функція runtime (постійні терми)
atomics, countersКожна функція (atomics і counters)
erts_internal, erts_code_purgerТе, що викликають stdlib і kernel; групи дистрибуції, .beam, емулятора й процесу purger — declined (erts_internal)
erl_prim_loaderФайлові запити поверх file; завантаження й архіви — declined (файли)
zlibКожна функція поверх зафіксованого zlib (модуль zlib)
prim_eval'receive'/2 поверх кроків скомпільованого receive (prim eval)
Модулі ASN.1 public_key ('OTP-PKIX', 'PKIX1Explicit-2009', ...) і public_key.hrlГенеруються під час збирання з library/public_key/asn1/ у library-asn1/public_key/ дерева збірки (public_key)
public_key, clause_public_key_codec, clause_public_key_keys, clause_public_keyЗастосунок public_key (з public_key.app): кодування DER і PEM, шифрування PEM, закриті ключі PKCS #8 усіх типів і сертифікати у формах plain та otp поверх згенерованих модулів (public_key, відкритий ключ); ключі, підписи, шифрування RSA, генерація й узгодження ключів, підписування сертифікатів через crypto (clause_public_key_keys, ключі); функції валідації — заглушки
clause_asn1Кодек, який викликають модулі, згенеровані clau зі специфікацій ASN.1 (кодек ASN.1, ASN.1); застосунок asn1 OTP (asn1ct, asn1rt_nif) не надається
crypto, clause_cryptoЗастосунок crypto (з crypto.app), поверх libcrypto OpenSSL в архіві криптографічного runtime (модуль crypto, OpenSSL): списки алгоритмів скомпонованого OpenSSL (supports/0,1, hash_info/1, info/0, info_lib/0), дайджести й стани хешування, HMAC/CMAC/Poly1305 і стани MAC, pbkdf2_hmac/5, hash_equals/2, exor/2, mod_pow/3, шифри та їхні стани (crypto_init/3,4, crypto_update/2, crypto_final/1, crypto_get_data/1, crypto_one_time/4,5, cipher_info/1), AEAD (crypto_one_time_aead/4,6,7, crypto_one_time_aead_init/4), криптографічно стійкі випадкові числа й модулі crypto, crypto_cache, crypto_aes і crypto_prng1 для rand, терми помилок OTP; рушії відхилено (notsup); режим FIPS перемикається як в OTP або фіксується через clau --fips; відкриті ключі (sign/4,5, verify/5,6, шифрування RSA, generate_key/2,3, compute_key/4, privkey_to_pubkey/2: RSA, DSA, DH, ECDSA/ECDH на іменованих і явно заданих кривих, EdDSA, X25519/X448, ML-DSA, SLH-DSA, SRP), ec_curve/1 і ec_curves/0 (явні параметри зі скомпонованої libcrypto), ML-KEM (encapsulate_key/2, decapsulate_key/3)

Результати й причини помилок збігаються з OTP 29, включно з формою помилок реалізацій OTP на Erlang (lists:map(F, x) дає {case_clause, x}, lists:nth(0, L) — function_clause, lists:seq(1, 10, 0) — badarg) і його BIF (lists:member/2, lists:keyfind/3, lists:reverse/2, функції maps: badarg, {badmap, M}, {badkey, K}). lists:member/2 порівнює через =:=, lists:keyfind/3 — через ==. lists:sort/1 — це стабільна вбудована функція runtime (порівняння й порядок). Трасування стека називають функції бібліотеки, а не OTP.

Інтерактивна оболонка

shell:start_interactive/0,1 запускає оболонку Erlang на стандартних потоках, а clau --shell компонує її у виконуваний файл, точкою входу якого вона є, якщо --entry не задає іншу (компіляція). Процес clause_shell займає місце user_drv OTP: виводить версію системи, запускає сервер shell і запускає новий, коли оболонка завершується (exit().). Сервер читає кожну команду через сервер стандартного вводу io, повторюючи запрошення для кожного наступного рядка команди, зберігає історію й запускає обчислювач, який перевіряє кожен вираз через erl_lint, розгортає record та обчислює його через erl_eval. Результати виводяться з record оболонки через форматувальник runtime (clause_io_lib:pretty/2, io_lib). Кінець вводу завершує програму з кодом 0 після *** Terminating erlang (nonode@nohost).

Команди викликають модулі за іменем, тож програмі, що запускає оболонку, потрібна можливість викликати кожен експорт: --shell зберігає їх (живість експортів) і компонує кожен модуль бібліотеки; програма, зібрана без нього, досягає лише названих нею модулів. Рядки вводу читаються в міру надходження з термінала й редагуються самим терміналом: редагування рядків edlin, клавіш історії чи доповнення Tab немає (відмінності).

Як програми їх отримують

Заміни модулів runtime

Clause заміщує модулі OTP, які ERTS реалізує на C (NIF, BIF, драйвери портів, попередньо завантажені модулі з erts/preloaded/src), і модулі, які OTP генерує під час власного збирання (unicode_util). kernel і stdlib з OTP — звичайний Erlang, але вони викликають ці модулі.

Надані або відсутні

Усе, що потребує runtime і не може бути написане звичайним Erlang, вирішується для кожного модуля окремо, а там, де модуль поєднує різні завдання, — для кожної групи функцій:

Функції, тривіальні для runtime, реалізуються без окремого рішення.

До якого модуля розв'язується ім'я

OTP на машині користувача необов'язковий; якщо він є, то не повинен змінювати того, що компілює збирання. Ім'я модуля розв'язується в такому порядку:

  1. Явні вхідні файли: вихідні файли, які перелічує користувач (sources, source_dirs, позиційні вхідні файли). Файл з іменем модуля Clause замінює його з попередженням, що називає обидва файли.
  2. Модулі Clause: модулі бібліотеки, включно з наданими замінами.
  3. source_search_paths, як описано в проєктах.

Ім'я відсутнього модуля зарезервовано: однойменний файл у шляху пошуку (наприклад, erts/preloaded/src/prim_file.erl з OTP) не використовується, а діагностика повідомляє, що Clause не надає цього модуля. Явний вхідний файл усе ж може його надати з попередженням про заміну.

ignore_modules діє і на модулі Clause: ігнорований модуль Clause відсутній у пакеті, і тоді явний вхідний файл може надати його без попередження, бо нічого не замінюється.

Файли

Документовані функції

library/documented.terms перелічує публічні функції, документовані OTP 29 для erts, kernel, stdlib, crypto і public_key: {Module, Application, Name, Arity}. на функцію, документація модуля й функції якої не прихована та яка не застаріла. Дані отримано з блоків документації хостової OTP через tests/compiler/library/observe_docs.escript (запускається явно). Недокументовані експорти залишаються в переліках, але можуть бути заглушками.

Типи

Оскільки модулі Clause мають перевагу над модулями OTP, код OTP, що називає file:filename() чи erlang:time_unit() у своїх специфікаціях, має знаходити ці типи в модулях Clause. Кожен наданий модуль, чий відповідник в OTP експортує типи, підключає <module>.types.hrl зі свого каталогу: список -export_type, потім експортовані типи й локальні типи та record, які вони використовують, так, як їх визначає OTP (документація показує ті самі визначення; встановлена документація не містить визначень типів, тож вони беруться з реалізації: налагоджувальної інформації beam або постачуваного вихідного коду попередньо завантаженого модуля, як-от erlang). escript tests/compiler/library/observe_types.escript LIBRARY APP MODULE записує заголовок з OTP хоста, а --check порівнює його форми зі свіжим спостереженням (CTest library_freshness); library_modules.py check вимагає, щоб кожен заголовок підключав його модуль. Типи, які заголовки називають з модулів поза програмою (unicode:chardata(), calendar:datetime()), і широкі об'єднання OTP (file:posix() має більше членів, ніж зберігає граф типів) розв'язуються в term() без попередження: ця діагностика стосується бібліотеки Clause, а не програми користувача.

Служби kernel під час запуску

file, io і code з OTP викликають зареєстровані сервери (file_server_2, code_server, сервер io лідера групи), які застосунок kernel запускає під час завантаження системи. Виконуваний файл Clause не запускає жодного з них: власним file і io з Clause сервер не потрібен, logger з Clause запускає свій сервер при першому використанні, а модуль OTP, якому сервер таки потрібен, завершується збоєм так само, як в OTP без цього сервера (noproc). Тому код OTP, що викликає code під час виконання, не працює. Завантаження всього застосунку kernel не планується.

Застосунки

Реєстр

План проєкту охоплює кожен документований модуль erts, kernel і stdlib; реальні програми (першою luerl) визначають пріоритети. Скомпілювати й запустити її, класифікувати кожну помилку (unknown module, undefined function M:F/A, непідтримуваний синтаксис або можливість, інше) та призначити кожну кроку плану, іншому пункту черги чи задокументованій відмові. Коли stderr запуску збережено у файл, python tests/compiler/library/library_modules.py report FILE виводить класифікацію таблицями: кожен невідомий модуль із кількістю помилок, модулями-викликачами й викликаними функціями з арностями; невизначені функції за модулями; інші повідомлення з кількостями.

Інструменти

Усі лежать у tests/compiler/library/: