Konsolenausgabe (io)
io:format/1,2,3, io:fwrite/1,2,3, io:put_chars/1,2 und io:nl/0,1 sind
Runtime-Builtins des Moduls io im Brückenkatalog
(Builtins); der Text entspricht io_lib:format/2, wird von
der Engine von io_lib aufgebaut und abgeflacht, wobei
~p nach den Regeln von io_lib_pretty aus OTP angeordnet wird
(io_lib/pretty.cpp). Die
Eingabefunktionen von io sind Erlang in der
Bibliothek.
Aufrufe
io:format(Format)istio:format(Format, []). Beide gebenokzurück.io:fwrite/1,2,3sind dasselbe wieio:format/1,2,3;io:nl/0,1schreiben einen Zeilenumbruch.- Geräte von
io:format/3,io:fwrite/3,io:put_chars/2undio:nl/1:standard_ioundusersind die Standardausgabe,standard_errorist die Standardfehlerausgabe (die Standardausgabe wird zuerst geleert, sodass beide ihre Reihenfolge behalten). Eine pid oder ein darauf registriertes Atom ist ein I/O-Server: Der Text geht als I/O-Protokollanfrage{put_chars, unicode, Utf8}an ihn (clause_io:put_chars/2), der Server schreibt ihn in seiner Kodierung, und der Aufruf gibt die Antwort zurück. Ein nicht registriertes Atom istbadarg, eine tote piderror:terminated, der Aufrufer selbsterror:calling_self, jeder andere Termfunction_clause, wie in OTP. io:put_chars(Chardata)schreibt Chardata: Unicode-Zeichen, UTF-8-Binaries und verschachtelte Listen, die auf[]oder ein Binary enden. Alles andere (ein Atom, ein Surrogat, ungültiges UTF-8, ein Bitstring) löstbadargaus.- Text wird vollständig aufgebaut und dann als UTF-8 geschrieben, wie es das
Standardausgabegerät von OTP im Modus
-noshelltut (Kodierungunicode). Ein Fehler schreibt nichts. Ein abgewiesener Schreibvorgang ist der Runtime-Fehleroutput_failure(Exit 70). - Qualifizierte Aufrufe,
fun io:format/2,apply(io, format, Args)undM:format(...)erreichen alle die Builtins. Ein Batch-Modul namensioersetzt die Builtins nicht (dasiovon OTP ist sticky, Registrierung).
Formate
Formatist ein Atom (seine Zeichen), ein Binary (seine Bytes als Latin-1-Zeichen) oder eine Liste. Ein Listenelement, das kein Zeichen ist, ist Chardata, wird unverändert ohne Steuersequenzen geschrieben und rückt die Spalte um eins vor (eine Eigenheit von OTP).- Steuersequenzen
~F.P.PadModC: FeldbreiteF(negativ oder-: linksbündig), GenauigkeitP, Füllzeichen,*entnimmt eine Ganzzahl (oder das Füllzeichen) den Argumenten, Modifikatorent(Unicode),l(keine String-Erkennung),k(geordnete Maps) undK(Reihenfolge aus den Argumenten:ordered,reversed; Vergleichs-funs ergebenbadarg). Maps werden in Schlüsselreihenfolge ausgegeben. - Alle Steuersequenzen von OTP 29 mit ihren Feldregeln:
~w ~W ~p ~P ~s ~e ~f ~g ~b ~B ~x ~X ~+ ~# ~c ~i ~n ~~.~skürzt oder füllt aufPinnerhalb vonF;~w, Ganzzahlen und Gleitkommazahlen geben*-Zeichen aus, wenn der Text nicht inFpasst;~cwiederholt das Zeichen; Ganzzahlbasen kommen ausP(2..36);~nmitFschreibtFZeilenumbrüche; Breiten werden wie beiio_lib:chars_length/1gezählt. - Ohne
tnimmt~snur Latin-1-Zeichen, und~cschreibt das niedrige Byte seiner Ganzzahl;~w/~pmaskieren Atomzeichen jenseits von Latin-1 als\x{...}. Mittliest~sBinaries als UTF-8 (mit Rückfall auf Latin-1), und~pschreibt<<"..."/utf8>>für druckbare UTF-8-Binaries. badarg: alles, woranio_lib:format/2scheitert (ein unbekanntes Steuerzeichen, fehlende oder überzählige Argumente, ein Argument falschen Typs,Fkleiner alsP, ein linksbündiges~poder~n, eine Basis außerhalb von 2..36), sowie Ausgabe, die kein Unicode ist.
Formatierte Ausgabe (~p)
- Die Zeilenlänge ist
F(Standard 80, 0 schreibt eine Zeile); die erste Spalte istP, sonst die Spalte, die die Ausgabe in ihrer Zeile erreicht hat (Tabs auf Vielfache von 8). ~Pbeschneidet den Term am Tiefenargument undchars_limit(Optionen vonio:format/3undio_lib:format/3) am Zeichenanteil der Steuersequenz, wobei wie in OTP...anstelle ausgelassener Teile ausgegeben wird.- Der Term wird zur Zwischenform von OTP: jeder Wert mit seiner einzeiligen
Länge; Strings (flache Listen druckbarer Latin-1-Zeichen, das standardmäßige
io:printable_range()), druckbare Binaries, Atome und Zahlen sind Text. - Was auf den Rest der Zeile passt, wird ganz geschrieben. Listen und Tupel
brechen zwischen Elementen um, ausgerichtet nach der Klammer; getaggte Tupel
(
{atom, ...}) richten sich nach dem Tag aus oder rücken um 4 (oder 1) ein, wenn das über die halbe Zeile hinausginge; Map-Paare und Felder nativer Records, die nicht passen, setzen den Wert in die nächste Zeile; lange Binaries brechen zwischen Bytes um. - Container, die tiefer als 256 verschachtelt sind, lösen
system_limitaus (das Layout rekursiert auf dem nativen Stack). - Die Formatierung läuft bis zum Ende, egal wie groß der Term ist (Portionen).
Clause