Sortie console (io)
io:format/1,2,3, io:fwrite/1,2,3, io:put_chars/1,2 et io:nl/0,1 sont
des builtins du runtime du module io dans le catalogue du pont
(builtins) ; le texte est celui de io_lib:format/2, construit
par le moteur d'io_lib puis aplati, avec ~p mis en
page selon les règles d'io_lib_pretty d'OTP
(io_lib/pretty.cpp). Les fonctions
d'entrée d'io sont en Erlang dans la bibliothèque.
Appels
io:format(Format)équivaut àio:format(Format, []). Les deux renvoientok.io:fwrite/1,2,3sont identiques àio:format/1,2,3;io:nl/0,1écrivent un saut de ligne.- Périphériques de
io:format/3,io:fwrite/3,io:put_chars/2etio:nl/1:standard_ioetuserdésignent la sortie standard,standard_errorla sortie d'erreur standard (la sortie standard est vidée d'abord, de sorte que les deux gardent leur ordre). Un pid, ou un atome enregistré pour l'un d'eux, est un serveur d'E/S : le texte lui est envoyé sous forme de requête du protocole d'E/S{put_chars, unicode, Utf8}(clause_io:put_chars/2), le serveur l'écrit dans son encodage, et l'appel renvoie la réponse. Un atome non enregistré donnebadarg, un pid morterror:terminated, l'appelant lui-mêmeerror:calling_self, tout autre termefunction_clause, comme OTP. io:put_chars(Chardata)écrit des chardata : caractères Unicode, binaries UTF-8 et listes imbriquées se terminant par[]ou un binary. Toute autre chose (un atome, un surrogate, de l'UTF-8 invalide, un bitstring) lèvebadarg.- Le texte est construit en entier, puis écrit en UTF-8, comme le fait le
périphérique de sortie standard d'OTP en mode
-noshell(encodageunicode). Une erreur n'écrit rien. Une écriture refusée est l'échec du runtimeoutput_failure(code de sortie 70). - Les appels qualifiés,
fun io:format/2,apply(io, format, Args)etM:format(...)atteignent tous les builtins. Un module du lot nomméione remplace pas les builtins (le moduleiod'OTP est sticky, enregistrement).
Formats
Formatest un atome (ses caractères), un binary (ses octets comme caractères Latin-1) ou une liste. Un élément de liste qui n'est pas un caractère est un chardata écrit tel quel, sans séquences de contrôle, et avance la colonne d'une unité (une bizarrerie d'OTP).- Séquences de contrôle
~F.P.PadModC: largeur de champF(négative ou-: alignement à gauche), précisionP, caractère de remplissage,*prenant un entier (ou le remplissage) dans les arguments, modificateurst(Unicode),l(pas de détection de chaînes),k(maps ordonnées) etK(ordre fourni par les arguments :ordered,reversed; les funs de comparaison donnentbadarg). Les maps s'affichent dans l'ordre des clés. - Tous les contrôles d'OTP 29 avec leurs règles de champ :
~w ~W ~p ~P ~s ~e ~f ~g ~b ~B ~x ~X ~+ ~# ~c ~i ~n ~~.~stronque ou complète jusqu'àPdansF;~w, les entiers et les flottants affichent des caractères*lorsque le texte ne tient pas dansF;~crépète le caractère ; les bases des entiers viennent deP(2..36) ;~navecFécritFsauts de ligne ; les largeurs sont comptées comme pario_lib:chars_length/1. - Sans
t,~sn'accepte que des caractères Latin-1 et~cécrit l'octet de poids faible de son entier ;~w/~péchappent les caractères d'atome au-delà de Latin-1 sous la forme\x{...}. Avect,~slit les binaries en UTF-8 (avec repli sur Latin-1) et~pécrit<<"..."/utf8>>pour les binaries UTF-8 imprimables. badarg: tout ce qui fait échouerio_lib:format/2(un caractère de contrôle inconnu, des arguments manquants ou en trop, un argument du mauvais type,Finférieur àP, un~pou~naligné à gauche, une base hors de 2..36), et une sortie qui n'est pas de l'Unicode.
Affichage formaté (~p)
- La longueur de ligne est
F(80 par défaut, 0 écrit une seule ligne) ; la première colonne estP, sinon la colonne que la sortie a atteinte sur sa ligne (tabulations aux multiples de 8). ~Pcoupe le terme à la profondeur passée en argument etchars_limit(options deio:format/3etio_lib:format/3) à la part des caractères attribuée au contrôle, en affichant...aux endroits omis, comme OTP.- Le terme devient la forme intermédiaire d'OTP : chaque valeur avec sa
longueur sur une ligne ; les chaînes (listes plates de caractères Latin-1
imprimables, l'
io:printable_range()par défaut), les binaries imprimables, les atomes et les nombres sont du texte. - Ce qui tient sur le reste de la ligne est écrit en entier. Les listes et les
tuples sont coupés entre les éléments, alignés après le crochet ou
l'accolade ; les tuples étiquetés (
{atom, ...}) s'alignent après l'étiquette, ou sont indentés de 4 (ou 1) lorsque cela dépasserait la moitié de la ligne ; les paires de map et les champs de native record qui ne tiennent pas placent la valeur sur la ligne suivante ; les binaries longs sont coupés entre les octets. - Les conteneurs imbriqués sur plus de 256 niveaux lèvent
system_limit(la mise en page est récursive sur la pile native). - Le formatage s'exécute jusqu'au bout, quelle que soit la taille du terme (portions).
Clause