Antra

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 " <> name

Die Funktion sagt nicht nur "ich erwarte irgendeinen Parameter". Sie sagt gleich:

  • ich erwarte eine Map
  • diese Map soll einen Key name haben
  • dessen Wert wird an die lokale Variable name gebunden

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 0 ist, gib 0 zurück
  • zweiter Fall: wenn der Eingabewert 1 ist, gib 1 zurü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: " <> msg
my 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

Quelle dieser Seite