Salida por consola (io)
io:format/1,2,3, io:fwrite/1,2,3, io:put_chars/1,2 e io:nl/0,1 son
builtins del runtime del módulo io en el catálogo del puente
(builtins); el texto es el de io_lib:format/2, construido por
el motor de io_lib y aplanado, con ~p dispuesto según
las reglas de io_lib_pretty de OTP
(io_lib/pretty.cpp). Las funciones
de entrada de io están escritas en Erlang en la biblioteca.
Llamadas
io:format(Format)equivale aio:format(Format, []). Ambas devuelvenok.io:fwrite/1,2,3son lo mismo queio:format/1,2,3;io:nl/0,1escriben un salto de línea.- Dispositivos de
io:format/3,io:fwrite/3,io:put_chars/2eio:nl/1:standard_ioyuserson la salida estándar,standard_errores la salida de error estándar (antes se vacía la salida estándar, de modo que ambas conservan su orden). Un pid, o un átomo registrado para uno, es un servidor de E/S: el texto se le envía como una solicitud{put_chars, unicode, Utf8}del protocolo de E/S (clause_io:put_chars/2), el servidor lo escribe en su codificación y la llamada devuelve la respuesta. Un átomo no registrado esbadarg, un pid muertoerror:terminated, el propio llamanteerror:calling_selfy cualquier otro términofunction_clause, como en OTP. io:put_chars(Chardata)escribe chardata: caracteres Unicode, binaries UTF-8 y listas anidadas que terminan en[]o en un binary. Cualquier otra cosa (un átomo, un sustituto (surrogate), UTF-8 no válido, un bitstring) lanzabadarg.- El texto se construye completo y luego se escribe como UTF-8, como hace el
dispositivo de salida estándar de OTP en modo
-noshell(codificaciónunicode). Un error no escribe nada. Una escritura rechazada es el fallo del runtimeoutput_failure(salida 70). - Las llamadas cualificadas,
fun io:format/2,apply(io, format, Args)yM:format(...)llegan todas a los builtins. Un módulo del lote llamadoiono sustituye a los builtins (eliode OTP es sticky, registro).
Formatos
Formates un átomo (sus caracteres), un binary (sus bytes como caracteres Latin-1) o una lista. Un elemento de la lista que no es un carácter es chardata que se escribe tal cual, sin secuencias de control, y avanza la columna en uno (una peculiaridad de OTP).- Secuencias de control
~F.P.PadModC: ancho de campoF(negativo o-: alineado a la izquierda), precisiónP, carácter de relleno,*que toma un entero (o el relleno) de los argumentos, modificadorest(Unicode),l(sin detección de cadenas),k(maps ordenados) yK(el orden de los argumentos:ordered,reversed; los funs de comparación sonbadarg). Los maps se imprimen en orden de claves. - Todos los controles de OTP 29 con sus reglas de campo:
~w ~W ~p ~P ~s ~e ~f ~g ~b ~B ~x ~X ~+ ~# ~c ~i ~n ~~.~strunca o rellena hastaPdentro deF;~w, los enteros y los flotantes imprimen caracteres*cuando el texto no cabe enF;~crepite el carácter; las bases de enteros se toman deP(2..36);~nconFescribeFsaltos de línea; los anchos se cuentan como lo haceio_lib:chars_length/1. - Sin
t,~ssolo acepta caracteres Latin-1 y~cescribe el byte bajo de su entero;~w/~pescapan los caracteres de átomos fuera de Latin-1 como\x{...}. Cont,~slee los binaries como UTF-8 (con Latin-1 como alternativa) y~pescribe<<"..."/utf8>>para binaries UTF-8 imprimibles. badarg: cualquier cosa en la que falleio_lib:format/2(un carácter de control desconocido, argumentos que faltan o sobran, un argumento de tipo incorrecto,Fmenor queP, un~po~nalineado a la izquierda, una base fuera de 2..36) y una salida que no es Unicode.
Impresión legible (~p)
- La longitud de línea es
F(80 por defecto; 0 escribe una sola línea); la primera columna esP, o si no, la columna que la salida ha alcanzado en su línea (los tabuladores avanzan a múltiplos de 8). ~Pcorta el término en su argumento de profundidad ychars_limit(opciones deio:format/3eio_lib:format/3) en la parte de caracteres asignada al control, imprimiendo...donde se omitieron partes, como OTP.- El término se convierte en la forma intermedia de OTP: cada valor con su
longitud en una línea; las cadenas (listas planas de caracteres Latin-1
imprimibles, el
io:printable_range()por defecto), los binaries imprimibles, los átomos y los números son texto. - Lo que cabe en el resto de la línea se escribe completo. Las listas y las
tuplas se parten entre elementos, alineadas tras el corchete; las tuplas
etiquetadas (
{atom, ...}) se alinean tras la etiqueta, o se sangran 4 (o 1) posiciones cuando eso superaría la mitad de la línea; los pares de maps y los campos de native records que no caben ponen el valor en la línea siguiente; los binaries largos se parten entre bytes. - Los contenedores anidados a más de 256 niveles lanzan
system_limit(la maquetación es recursiva sobre la pila nativa). - El formateo se ejecuta hasta el final, por grande que sea el término (porciones).
Clause