Clause
← Gesamte Dokumentation

Übersetzt aus dem englischen Original · 06042fa · 2026-10-09 · Auf Englisch lesen

Unterschiede zu Erlang/OTP

Beobachtbares Verhalten, bei dem Clause bewusst vom festgelegten OTP 29 (maint-29, siehe otp-reference.md) abweicht. Jeder Eintrag verweist auf den Vertrag, dem er gehört. Ein Eintrag wird entfernt, sobald der Unterschied behoben ist. Noch nicht implementierte Funktionen (gemeldet als notimpl) sind hier nicht aufgeführt; siehe features.md und den Plan.

Maps

UnterschiedOTPClauseZuständig
Reihenfolge des Map-Generators (K := V <- M)Flache Maps (bis zu 32 Schlüssel) werden in Schlüsselreihenfolge durchlaufen, Atom-Schlüssel jedoch in Atomtabellen-Reihenfolge, die zwischen VM-Läufen variiert; größere Maps in Hash-ReihenfolgeImmer kanonische Schlüsselreihenfolge (Term-Ordnung)Muster
bad_generators-Nutzlast eines Map-Generators in einer Zip-GruppeSein Iterator: {K, V, Next}-Kette, die mit none endet, in der Reihenfolge von OTPDieselbe Kette, in kanonischer Schlüsselreihenfolge aufgebautMuster
Ausgabe von Maps (erlang:display/1, ~w, ~p)Reihenfolge des internen Layouts (Atomtabellen-Reihenfolge für Atom-Schlüssel, Hash-Reihenfolge über 32 Schlüssel)Reihenfolge der Map-Schlüssel, wie OTPs ~kwTerme
Ausgabe nativer Records (erlang:display/1)Felder in der Reihenfolge der Atomtabellen-IndizesDefinitionsreihenfolge, wie ~wNative Records
== zwischen nativen Records, deren Felder sich nur als Ganzzahl/Gleitkommazahl unterscheidenDer Compiler kann es zu =:= falten (false)Numerischer Vergleich (true)Native Records
Ausgabe lokaler Funs (#Fun<M.Index.Uniq>)Index aus der Lambda-Nummerierung des Compilers, Uniq ein Hash des ModulcodesIndex der lokalen Funs des Moduls in Quelltextreihenfolge, Uniq immer 0Funs
Ordnung zweier lokaler Funs eines ModulsNach dem Index von OTPNach dem Index in Quelltextreihenfolge, sodass Funs verschiedener Funktionen anders geordnet sein könnenFuns
Namen anonymer Funs in Stacktraces (-f/1-fun-N-)N aus der Nummerierung des CompilersN zählt die Funs von f/1 in QuelltextreihenfolgeFuns
Eine anonyme Fun im Standardwert eines Record-FeldsJede Konstruktionsstelle expandiert ihre eigene Kopie: Funs von zwei Stellen sind ungleichEine Fun für den Standardwert: Funs von jeder Konstruktionsstelle sind gleichFuns
Reihenfolge der erfassten Werte von Funs, die in Comprehensions erzeugt werdenFreie Variablen der von der Comprehension erzeugten FunktionDefinitionsreihenfolge in der umschließenden Funktion; nur sichtbar beim Vergleich zweier solcher FunsFuns

Pids, Referenzen und Prozesse

UnterschiedOTPClauseZuständig
Pid-NummernDer erste Benutzerprozess ist etwa <0.80.0>; Nummern werden wiederverwendet, nachdem die Pid-Tabelle überläuftDer erste Prozess ist <0.1.0>; Nummern stammen aus einer Sequenz und werden nie wiederverwendetTerme
Code nach spawn(Fun) einer Fun anderer StelligkeitDie Typanalyse des Compilers kann den Code nach dem Aufruf als unerreichbar ansehen und entfernen, sodass der Aufrufer sofort die Pid zurückgibtDer Aufrufer läuft weiter; nur der neue Prozess schlägt mit {badarity, {Fun, []}} fehlProzesse
Formatieren eines großen Terms (io:format/1,2)Läuft in Erlang-Code (io_lib) und im Group Leader, sodass der Prozess während des Formatierens verdrängt werden kannLäuft in einem Builtin-Aufruf bis zum Ende; andere Prozesse wartenBuiltins
Flags von process_flag/2trap_exit, priority, message_queue_data, min_heap_size und weitereNur trap_exit; jedes andere Flag löst badarg ausProzesse
Reihenfolge der Fehlerberichte gleichzeitig abstürzender ProzesseLogger-ReihenfolgeDie Reihenfolge, in der ihre Worker sie beendenProzesse
Signale an einen Prozess, der auf einem anderen Scheduler läuftIn seine Signalwarteschlange eingereiht und später behandelt, während der Sender weiterläuftDer Sender wartet, bis die Zeitscheibe des Ziels endet, und handelt dann sofort; nur als Zeitverhalten beobachtbarProzesse
list_to_port/1 einer nie vergebenen NummerGibt einen Port-Term zurückbadarg: nur von diesem Programm geöffnete Ports werden zugelassenPorts
Werte von port_info/1,2id ist ein Tabellenindex; memory, queue_size, locking beschreiben den Treiberid ist die Port-Nummer; memory und queue_size sind 0; locking ist port_levelPorts
Schreiben in eine nur zum Lesen geöffnete Datei{error, eacces} unter Windows, {error, ebadf} anderswo{error, ebadf} überallPorts
io:get_line, io:get_chars und file:read/2 im Listenmodus bei Nicht-ASCII-EingabeZeichen gemäß der Gerätekodierung dekodiertEin Listenelement pro BytePorts
Ergebnis von os:cmd/1Aus der Ausgabe dekodierte Unicode-ZeichenDie Bytes der AusgabePorts
Leere Argumente von {spawn_executable, F} unter WindowsAus der Befehlszeile entferntAls "" übergebenPorts
{exit_status, S} und eof eines gestarteten ProgrammsUnbestimmte Reihenfolge, exit_status kann vor den letzten Daten ankommenNach allen Daten, vor eofPorts
Ausgelastete PortsEin Port mit zu viel ausstehender Ausgabe suspendiert Sender; force von port_command/3 funktioniert bei Treibern, die es erlaubenAusgabe suspendiert nie; force löst bei jedem Treiber notsup ausPorts
{active, N} von SocketsEine Ganzzahl N zählt Nachrichten bis {tcp_passive, S}exit(badarg); nur true, false und oncePorts
Socket-Tuning-Optionen (nodelay, keepalive, send_timeout, delay_send, Puffer)Angewendet; andere inet-Optionen (header, {packet, line}, http, ...) funktionierenDie aufgeführten Tuning-Optionen werden akzeptiert, aber nicht angewendet; andere Optionen ergeben exit(badarg)Ports
Socket-FehlergründeJeder POSIX-Grund, den das System meldetDie gängigen (econnrefused, eaddrinuse, econnreset, etimedout, ...); andere sind eioPorts
Port-Eingabe, während der verbundene Prozess 1.024 Nachrichten hält und laufen kannLiest und liefert weiterLiefert nicht mehr, bis die Zeitscheibe des Prozesses endet; ab 64 KiB gehaltener Daten wird nicht mehr gelesen, sodass das schreibende Programm blockiertPorts
gen_tcp:close/1 mit ausstehender AusgabeWartet bis zur Einstellung linger/send_timeout, bis die Ausgabe gesendet istKehrt sofort zurück; der I/O-Thread sendet die ausstehende Ausgabe und schließt dannPorts
Typen von monitor/2process, port, time_offsetprocess und port; time_offset löst badarg aus (keine Änderungen des Zeitversatzes)Prozesse
exit/2, exit_signal/2 an eine ReferenzSendet an den Prozess-Alias, falls die Referenz ein aktiver istNichts (keine Aliase)Prozesse
ReferenznummernMischen eine Scheduler-Kennung und Zähler pro Scheduler (#Ref<0.178111994.4235460610.214105>)Ein programmweiter Zähler (#Ref<0.0.0.1>), sodass Referenzen nach Erzeugung geordnet sindTerme

Fehler, Stacktraces und Berichte

UnterschiedOTPClauseZuständig
Orte im Stacktrace[{file, F}, {line, L}], error_info für error/3Immer []; kein error_infoABI
Oberster Frame bei function_clauseArgumentlisteStelligkeitABI
Oberster Frame bei undef{M, F, Args, []} der fehlenden FunktionDer Frame der aufrufenden FunktionFuns
Frames fehlschlagender BIFs/OperatorenVorhanden ({erlang, '+', Args, ...})Fehlen; nichts unterhalb der EinstiegsfunktionABI
Atomtabelle voll (list_to_atom/1)Der Emulator bricht ab (no more index entries in atom_tab) und schreibt einen Crash-Dumpclau: runtime failure: entry call failed: resource_limit, Exit-Code 70Builtins
list_to_integer/1,2 mit Zeichen über 255Die ersten Ziffern verwenden nur das niedrige Byte jedes Zeichens ([16#131] ist 1)badargBuiltins
erlang:function_exported/3 eines BIFWahr für jedes BIF des EmulatorsNur wahr für die Builtins, die diese Runtime bereitstelltBuiltins
Fehlerberichte abgestürzter ProzesseAn den Logger gesendet, später von dessen Standard-Handler geschrieben (unter erl auf die Standardausgabe, oft verloren, wenn ein Escript vorher anhält)Auf stderr geschrieben, wenn der Prozess endet, vor jeder späteren AusgabeProzesse
Aufrufe von Funktionen, die nie zurückkehrenAls Endaufrufe kompiliert (Aufrufer fehlt im Trace)Gewöhnliche Aufrufe (Aufrufer vorhanden)ABI
Hostspeicher erschöpftDer Emulator meldet, dass er keinen Speicher allozieren kann, schreibt einen Crash-Dump und stopptclau: runtime failure: entry call failed: out_of_memory, Exit-Code 70, kein DumpRuntime-Heap
Speicherobergrenze pro Prozessmax_heap_size (in Wörtern, Heap und Stack) beendet den Prozess mit Grund killed und protokolliert einen Fehlerbericht--max-heap / --max-stack (Bytes) und das runtimeweite --max-memory lassen den anfordernden Prozess mit resource_limit fehlschlagen: clau: runtime failure: entry call failed: resource_limit, Exit-Code 70Runtime-Heap
Programmargumenteescript übergibt jedes Argument an main/1; Emulator-Flags (+t) kommen aus %%! oder ERL_FLAGSFührende Runtime-Optionen (--max-atoms, --max-heap, --max-stack, --max-memory, --args-file, --) werden zuerst herausgenommen; CLAUSE_FLAGS enthält dieselben OptionenAusführbare Dateien
Nicht abgefangene Ausnahme in einem gewöhnlichen Einstiegsmodulescript endet mit 127Endet mit 1 und einer Zeile uncaught exception <class>: <reason> (Escript-Quellen behalten 127)Ausführbare Dateien
Compiler-DiagnosenWortlaut von erl_lint (variable 'X' is unbound) und WarnungenEigener Wortlaut (unbound variable X); OTP-Lint-Warnungen werden größtenteils nicht ausgegeben (auch nicht für unbekannte Felder nativer Records in Zugriff, Aktualisierung und Mustern)Semantik

Sprachliche Grenzfälle

UnterschiedOTPClauseZuständig
Ganzzahlsegment breiter als die Ganzzahlgrenze, Wert darüber hinaus (<<V:4194241>> aus lauter Einsen)Der x86-JIT matcht mit einem ungültigen Term; dessen Verwendung bringt die VM zum AbsturzKein MatchTerme
Zip-Gruppe, deren lockere und strikte Generatoren sich eine Variable teilenDer Überspringtest behält Variablen strikter Muster in den lockeren MusternEin verworfener Schritt wird übersprungen, sobald die strikten Muster für sich allein matchenMuster
Aufruf einer externen Fun, M:F(Args) oder apply/3 eines Moduls außerhalb des ProgrammsLädt das Modul aus dem Codepfad, undef, wenn es fehltundef; Bibliotheksmodule werden nur Teil des Programms, wenn es sie mit einem literalen Atom benenntFuns, Bibliothek
lists und mapsDie vollständigen Module; maps:keys/1, values/1, to_list/1, fold/3 folgen der internen Reihenfolge der Map (Atomtabellen-Reihenfolge für Atom-Schlüssel, Hash-Reihenfolge über 32 Schlüssel)Die Bibliotheksteilmenge; Map-Funktionen folgen der SchlüsselreihenfolgeBibliothek
Dateien ohne #!, die als Escripts übergeben werdenescript file.erl überspringt die erste ZeileAls gewöhnliche Module kompiliertAusführbare Dateien
Vorkompilierte Beam- und Archiv-EscriptsLaufenNicht unterstütztAusführbare Dateien
Eine -spec, deren Typen keinen Wert mit dem inferierten Ergebnis, der Einstiegsdomäne oder den Argumenten eines Aufrufs gemeinsam habenKompiliert; Dialyzer kann warnenKompilierfehler, der den deklarierten und den inferierten Typ nenntSemantische Analyse

io

UnterschiedOTPClauseZuständig
Steuersequenzen ~e ~f ~g ~x ~X ~+ ~# ~W ~P, Modifikator KFormatiertbadargio
~p von Containern, die tiefer als 256 Ebenen verschachtelt sindAusgegebensystem_limitio
Feldbreiten und ~ts-Präzision bei kombinierenden Zeichen oder \r\nZählen Graphem-ClusterZählen Codepointsio
Negative Präzision oder Füllanzahl (~.*c mit -1)Endlosschleifebadargio
io-Funktionen außer format/1,2, put_chars/1Existierenunknown module ioio