Clause
← Gesamte Dokumentation

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

Muster, Klauseln und Matches im Rumpf

Köpfe von Funktionsklauseln, Matches im Rumpf, case-Klauseln und if-Guards sind für jede zugelassene Term-Art ausführbar (Terme). Zulässigkeit und Verfügbarkeit werden getrennt geprüft: Ungültiges Erlang ist selbst in unerreichbarem Code ein semantischer Fehler; zulässiger Code, der ein fehlendes Feature braucht, erhält eine Capability-Diagnose; ein Nichtübereinstimmen (mismatch) zur Laufzeit ist nie ein Compiler-Fehler.

KontextStatus
Funktionsköpfe + GuardsImplementiert; Erschöpfung löst error:function_clause aus
Matches und Sequenzen im Rumpf, begin/endImplementiert; Fehlschlag löst error:{badmatch, RHS} aus
case-Klauseln + GuardsImplementiert; Erschöpfung löst error:{case_clause, Value} aus
if-Guard-KlauselnImplementiert; Erschöpfung löst error:if_clause aus
maybe mit ?= und else-KlauselnImplementiert; ein fehlgeschlagenes ?= liefert seinen Wert oder wählt eine else-Klausel, deren Erschöpfung error:{else_clause, Value} auslöst; erfordert das Feature maybe_expr (Präprozessor)
Listen-, Binary- und Map-ComprehensionsImplementiert (unten)
catch ExprImplementiert; keine Muster (ABI)
try-of- und Catch-KlauselnImplementiert; Erschöpfung von of löst error:{try_clause, Value} aus, nicht gematchte Ausnahmen werden erneut ausgelöst, und after läuft auf jedem Pfad (ABI); Class:Reason:Stack bindet den Stacktrace
Fun-KlauselnCapability (F18)
receiveCapability (F22/F25)

Comprehensions

[T1, ..., Tn || Q1, ..., Qm], << T || Q1, ... >> und #{K => V, ... || Q1, ... } folgen OTP 29:

Jeder Generator ist eine Schleife im Funktionsrumpf, deren Eingabecursor (ein Listen- oder Bitstring-Rest oder eine Map und eine Position) in Term-Slots des Frames liegt; die erzeugten Elemente sammeln sich umgekehrt in einem weiteren Term-Slot und werden am Ende einmal zur Liste, zum verbundenen Bitstring oder zur Map, sodass lange Eingaben konstanten nativen Stack und Prozess-Stack brauchen.

Musterformen

FormRegelAbweisung
_Bindet nie; Vorkommen unabhängigLesen von _ ist semantisch
Name, _Name, WiederholungenEinmalige Zuweisung; Wiederholungen brauchen exakte Gleichheit (1 ≠ 1.0)Lesen ungebunden/unsicher ist semantisch; Ungleichheit ist Nichtübereinstimmen
P1 = P2, KlammernBeide schränken denselben Wert ein; keine Schlüssel-/Größenbindungen zwischen GeschwisternUnzulässige Geschwisterabhängigkeit ist semantisch
Atome, Ganzzahlen, Zeichen, GleitkommazahlenExakte Gleichheit; vorzeichenbehaftete Null unterschiedenNichtübereinstimmen
Konstante ArithmetikMusteroperatoren von OTP exakt gefaltet; 1 div 0 und Nichtkonstanten abgewiesenSemantisch
Tupel, Listen, unechte Reste, ZeichenkettenExakte Stelligkeit und Cons/Nil-Form; Zeichenketten sind ListenNichtübereinstimmen
"prefix" ++ TailNur literale Zeichenkette oder literale Ganzzahllisten als PräfixVariables Präfix ist semantisch
#{K := P}Nur :=; zusätzliche Schlüssel erlaubt; #{} prüft den Typ; Schlüssel sind Guard-Ausdrücke über eingehende Bindungen=>, ungebundener Schlüssel semantisch; fehlender Schlüssel ist Nichtübereinstimmen
BitstringsTyp/Größe/Einheit validiert; frühere Segmente dürfen spätere dimensionieren; Rest ohne Größe zuletztUngültiger Spezifikator semantisch; zu kurze Daten sind Nichtübereinstimmen
Tupel-Records #r{f = P}, #r.fZu Tupel-Einschränkungen expandiert; ausgelassene Felder uneingeschränktUnbekannter Record/unbekanntes Feld semantisch
Lokale native Records #r{f = P}Record dieses Moduls namens r, dann jedes aufgeführte Feld (ein fehlendes Feld schlägt fehl)Unbekannter Record semantisch
Qualifizierte/importierte native Records #m:r{f = P}Record des Moduls m namens r; exportiert, wenn ein Feld aufgeführt ist; dann jedes FeldKeine zur Compile-Zeit
Anonyme Records #_{f = P}Jeder native Record; exportiert oder in diesem Modul definiert, wenn ein Feld aufgeführt ist#_{...} als Ausdruck ist ein Fehler
Aufrufe, variable Arithmetik, andere AusdrückeKeine MusterSemantisch

Gültigkeitsbereiche

Map-Schlüssel und Binary-Größen lesen die eingehende Umgebung, nie Geschwister: #{K := V} = #{key := K} und <<X:N>> = <<N:8>> können ihren eigenen Schlüssel bzw. ihre eigene Größe nicht binden. Innerhalb eines Binary darf eine Größe frühere Segmente lesen: <<N:8, X:N>> ist zulässig; {N, <<X:N>>} braucht ein zuvor gebundenes N. Konstante fehlerhafte Arithmetik in einem Schlüssel oder einer Größe ist zulässig und schlägt zur Match-Zeit fehl.

Die Binary-Validierung weist Segmente mit verschachtelten Containern/Aliasen, widersprüchliche Modifikatoren, ungültige Einheitenbereiche, Einheit ohne Größe bei Ganzzahl-/Gleitkomma-Standards, ungültige UTF-Größe/-Einheit, typisierte/dimensionierte literale Zeichenketten und Binary-Segmente ohne Größe, die nicht am Ende stehen, ab.

Ausführung

Grenzen

Die Normalisierung von Mustern teilt sich das semantische Budget des Moduls von 1.000.000 Einheiten (eine Ganzzahl kostet etwa so viel wie ihre Dezimalziffern); eine Konstante jenseits der Ganzzahlgrenze von 4.194.240 Bit ist ein illegal pattern, wie in OTP (Terme). Jeder Match-Plan hat eine Obergrenze von 100.000 Arbeitseinheiten. Der Parser begrenzt die Verschachtelung separat auf 256 (harte Obergrenze 512).