Start
Einstieg in Antra
Antra ist eine funktionale Sprache mit Pattern Matching, exakter Rational-Arithmetik und einem einfachen Modulsystem.
Wenn du bisher eher imperative Sprachen genutzt hast, wirken drei Dinge anfangs ungewohnt:
- Funktionen beschreiben oft schon in ihrer Signatur, welche Form ein Wert haben muss.
- Daten werden häufiger gematcht als Schritt für Schritt abgefragt.
- Viele kleine Ausdrücke werden aneinandergereiht, statt mit viel Zustand zu arbeiten.
Das Grundgefühl#
Antra-Code liest sich oft so, als würde man Datenformen beschreiben:
fn greet(%{name: name}) -> "Hallo " <> nameDie Funktion sagt nicht nur "ich erwarte irgendeinen Parameter". Sie sagt gleich:
- ich erwarte eine Map
- diese Map soll einen Key
namehaben - dessen Wert wird an die lokale Variable
namegebunden
Das ist der Kern von Pattern Matching.
Ein erstes Beispiel#
fn fibo(0) -> 0
fn fibo(1) -> 1
fn fibo(n) when n > 0 -> fibo(n - 1) + fibo(n - 2)Auch ohne Vorkenntnisse lässt sich das lesen:
- erster Fall: wenn der Eingabewert
0ist, gib0zurück - zweiter Fall: wenn der Eingabewert
1ist, gib1zurück - sonst: wenn
n > 0, rechne rekursiv weiter
Es gibt also nicht nur einen Body mit if, sondern mehrere Klauseln. Das ist in Antra normal.
Werte statt Klassenhierarchien#
Antra arbeitet stark mit einfachen Werten:
- Zahlen
- Strings
- Arrays
- Maps
- Tagged Arrays und Tagged Maps
Tagged Values sind wichtig, weil sie Daten eine erkennbare Form geben, ohne dass du dafür ein großes OOP-Modell brauchst.
my ok = %Ok[42]
my user = %User{name: "Felix", age: 20}%Ok[...] und %User{...} tragen einen Tag, den man später matchen kann.
Pattern Matching ohne Mysterium#
Wenn du noch nie Pattern Matching benutzt hast, hilft diese Übersetzung:
- Ein Pattern ist eine Formbeschreibung.
- Beim Matchen wird geprüft, ob ein Wert zu dieser Form passt.
- Wenn er passt, können Teile des Werts direkt an Namen gebunden werden.
Beispiel:
fn show_user(%User{name: name, age: age}) -> name <> " (" <> str(age) <> ")"Die Funktion nimmt nur %User{...}-Werte an. Gleichzeitig extrahiert sie name und age.
Was Antra nicht ist#
Antra ist keine Sprache, in der man jeden Zustand krampfhaft vermeiden muss. Es gibt:
- normale Variablen mit
my - explizite Mutation über
= - tiefe Updates mit
:= - mutierende Parameter mit
mut
Der Unterschied ist eher: Mutation ist sichtbar und absichtlich, nicht der Default für alles.
Wie du diese Doku am besten liest#
Wenn dir Begriffe wie "Tagged Value", "Guard" oder "Destructuring" nichts sagen, lies die Kapitel in Reihenfolge. Wenn du nur schnell etwas nachsehen willst, spring direkt weiter:
Minimaler Start#
fn greet(name) -> "Hallo " <> name
println(greet("Welt"))fn describe(%Ok[value]) -> "ok: " <> str(value)
fn describe(%Err[msg]) -> "fehler: " <> msgmy config = %{host: "localhost", port: 8080}
println(config.host)Diese drei Mini-Beispiele zeigen schon viel vom Charakter der Sprache:
- normale Funktionen
- Pattern Matching über Tags
- Datenzugriff über Maps
