Syntax im Überblick
x = 1 Zuweisung/Match ^x Pin
{a, b} = {1, 2} Tupel [h | t] = [1, 2, 3]
%{k: v} = map Map-Match %Struct{f: v}
fn x -> x end anonyme Funktion &(&1 + 1) Capture
def f(x) when x > 0, do: … Funktion mit Guard defp privat
x |> f() |> g(1) Pipe
case v do pattern -> … end if/unless/cond/with
for x <- l, cond, do: … ComprehensionWichtige Module
| Modul | Zweck | Beispiele |
|---|---|---|
Enum | Collections (sofort) | map filter reduce sort_by group_by frequencies |
Stream | Collections (lazy) | iterate unfold cycle take_while |
String | Text | split trim upcase replace contains? slice |
List | Listen | first last delete insert_at flatten |
Map / Keyword | Maps / Keyword-Listen | get put merge update fetch |
Integer / Float | Zahlen | parse to_string pow round |
File / Path | Dateien | read write exists? ls join |
IO | Ein-/Ausgabe | puts inspect gets |
Process / Task / Agent / GenServer | Nebenläufigkeit | spawn send receive async await |
Kernel | Grundfunktionen | length hd tl elem is_integer max min |
DateTime / Date / Time | Zeit | utc_now new! diff add |
Regex | reguläre Ausdrücke | ~r/…/, run scan replace |
d = ~D[2025-03-15]
IO.inspect(Date.add(d, 20))
IO.inspect(Date.day_of_week(d))
IO.inspect(Date.diff(~D[2025-12-24], d))
IO.inspect(DateTime.to_iso8601(~U[2025-03-15 14:30:00Z]))
IO.inspect(Regex.scan(~r/\d+/, "a1b22c333"))
IO.inspect(Regex.replace(~r/(\w+)@(\w+)/, "mia@example", "\\2 at \\1"))
IO.inspect("2025-03-15" =~ ~r/^\d{4}-\d{2}-\d{2}$/)
IO.inspect(Path.join("a", "b.txt") |> Path.extname())~D[2025-04-04] 6 284 "2025-03-15T14:30:00Z" [["1"], ["22"], ["333"]] "example at mia" true ".txt"
Häufige Fehler
| Meldung / Problem | Ursache | |
|---|---|---|
(MatchError) no match of right hand side value | Muster passt nicht zum Wert | |
(FunctionClauseError) no function clause matching | keine Klausel passt: Fall ergänzen | |
(UndefinedFunctionError) | Funktion/Modul nicht vorhanden oder falsche Stelligkeit | |
(ArgumentError) | falsche Argumente (z. B. String.to_integer("x")) | |
(KeyError) key :x not found | Map/Struct hat den Schlüssel nicht: Map.get, m[:x] | |
(CompileError) undefined function x/0 | Variable nicht definiert oder Tippfehler | |
Listen mit ++ an der falschen Stelle | `[x | liste] (vorn) ist schnell, liste ++ [x]` (hinten) langsam |
| Variable "ändert" sich nicht | Daten sind unveränderlich; Ergebnis neu binden | |
Prozess hängt in receive | keine Nachricht kommt: after-Timeout setzen |
Konventionen
snake_casefür Funktionen/Variablen,CamelCasefür Module, Atome klein- Funktionen mit
?liefern Boolean (empty?), mit!können Exceptions werfen mix formatformatiert; Credo (Stil) und Dialyzer (Typen) prüfen- Dokumentieren mit
@moduledoc/@doc/@spec, testen mit ExUnit und Doctests
Weiterlernen
- Offizielle Anleitung hexdocs.pm/elixir ("Getting Started"), Exercism (Elixir-Track)
- Bücher: Programming Elixir, Elixir in Action, Designing Elixir Systems with OTP
- Phoenix-Guides (hexdocs.pm/phoenix), Elixir Forum, ElixirConf-Vorträge
Merke
- Pattern Matching, Pipes und Unveränderlichkeit prägen jeden Elixir-Code
- Prozesse und OTP machen Nebenläufigkeit und Fehlertoleranz zur Normalität
- Mix, ExUnit und Hex bilden die Werkzeugkette, Phoenix das Web-Framework