Вивід на консоль (io)
io:format/1,2,3, io:fwrite/1,2,3, io:put_chars/1,2 та io:nl/0,1 —
вбудовані функції runtime модуля io у каталозі мосту
(вбудовані функції); текст відповідає io_lib:format/2, його
будує рушій io_lib і перетворює на плоску послідовність,
а ~p розміщує за правилами io_lib_pretty OTP
(io_lib/pretty.cpp). Функції введення
io написано Erlang у бібліотеці.
Виклики
io:format(Format)— цеio:format(Format, []). Обидва повертаютьok.io:fwrite/1,2,3— те саме, щоio:format/1,2,3;io:nl/0,1пишуть символ нового рядка.- Пристрої
io:format/3,io:fwrite/3,io:put_chars/2іio:nl/1:standard_ioіuser— це стандартний вивід,standard_error— стандартний потік помилок (спершу скидається стандартний вивід, тож обидва зберігають порядок). Pid або атом, зареєстрований за ним, є сервером I/O: текст надсилається йому як запит протоколу I/O{put_chars, unicode, Utf8}(clause_io:put_chars/2), сервер записує його у своєму кодуванні, а виклик повертає відповідь. Незареєстрований атом даєbadarg, мертвий pid —error:terminated, сам викликач —error:calling_self, будь-який інший терм —function_clause, як в OTP. io:put_chars(Chardata)пише chardata: символи Unicode, binary в UTF-8 і вкладені списки, що закінчуються на[]або binary. Будь-що інше (атом, сурогат, некоректний UTF-8, bitstring) породжуєbadarg.- Текст будується повністю, а потім записується як UTF-8, як це робить
пристрій стандартного виводу OTP у режимі
-noshell(кодуванняunicode). Помилка нічого не записує. Відхилений запис — це збій runtimeoutput_failure(код виходу 70). - Кваліфіковані виклики,
fun io:format/2,apply(io, format, Args)іM:format(...)усі доходять до вбудованих функцій. Модуль пакета з ім'ямioне замінює вбудовані функції (ioв OTP є «липким», sticky, реєстрація).
Формати
Format— це атом (його символи), binary (його байти як символи Latin-1) або список. Елемент списку, що не є символом, — це chardata, що пишеться як є, без керівних послідовностей, і зсуває стовпчик на одиницю (особливість OTP).- Керувальні послідовності
~F.P.PadModC: ширина поляF(від’ємна або-: вирівнювання ліворуч), точністьP, символ заповнення,*бере ціле число (або заповнення) з аргументів, модифікаториt(Unicode),l(без визначення рядків),k(упорядковані map) таK(порядок з аргументів:ordered,reversed; fun порівняння даютьbadarg). Map виводяться в порядку ключів. - Усі керувальні послідовності OTP 29 з їхніми правилами полів:
~w ~W ~p ~P ~s ~e ~f ~g ~b ~B ~x ~X ~+ ~# ~c ~i ~n ~~.~sобрізає або доповнює доPу межахF;~w, цілі й числа з рухомою комою виводять символи*, якщо текст не вміщується вF;~cповторює символ; основи цілих беруться зP(2..36);~nзFзаписуєFнових рядків; ширини рахуються як уio_lib:chars_length/1. - Без
t~sприймає лише символи Latin-1, а~cпише молодший байт свого цілого числа;~w/~pекранують символи атомів поза Latin-1 як\x{...}. Зt~sчитає binary як UTF-8 (з поверненням до Latin-1), а~pпише<<"..."/utf8>>для друковних binary в UTF-8. badarg: усе, на чому завершується помилкоюio_lib:format/2(невідомий керувальний символ, відсутні чи зайві аргументи, аргумент хибного типу,Fменше заP, вирівняні ліворуч~pчи~n, основа поза 2..36), а також вивід, що не є Unicode.
Форматований друк (~p)
- Довжина рядка —
F(типово 80, 0 пише один рядок); перший стовпчик —P, інакше стовпчик, якого вивід досяг у своєму рядку (табуляції до кратних 8). ~Pобрізає терм за аргументом глибини, аchars_limit(параметриio:format/3таio_lib:format/3) — за часткою символів для цієї керувальної послідовності, виводячи...замість пропущених частин, як OTP.- Терм перетворюється на проміжну форму OTP: кожне значення з довжиною в один
рядок; рядки (пласкі списки друковних символів Latin-1, типовий
io:printable_range()), друковні binary, атоми й числа є текстом. - Те, що вміщується в залишок рядка, пишеться повністю. Списки й кортежі
розриваються між елементами з вирівнюванням після дужки; позначені кортежі
(
{atom, ...}) вирівнюються після мітки або мають відступ 4 (чи 1), коли інакше вийшли б за половину рядка; пари map і поля native record, що не вміщуються, переносять значення на наступний рядок; довгі binary переносяться між байтами. - Контейнери з вкладеністю понад 256 рівнів породжують
system_limit(розкладка рекурсивно використовує нативний стек). - Форматування виконується до кінця, хоч яким великим був би терм (порції).
Clause