Ivy ist ein Interpreter für eine APL-ähnliche Sprache von Rob Pike (Mitentwickler von Go und Plan 9). Pike bezeichnet Ivy selbst als „plaything and work in progress": einen spielerischen, aber vollwertigen Taschenrechner und Array-Interpreter, der seit 2014 entsteht und in Go geschrieben ist. Ivy nutzt statt der APL-Sonderzeichen eine ASCII-Eingabe und ist damit deutlich zugänglicher als klassisches APL.
Installation und Start
go install robpike.io/ivy@latest
ivy
Wichtige Befehle und Konzepte
- Exakte Arithmetik: rationale Zahlen beliebiger Genauigkeit, z. B.
1/3; komplexe Zahlen als ein Token1j2 - Recht-assoziative Auswertung:
3*4+5ergibt 27 (gruppiert als3*(4+5)) - Vektoren:
1 2 3ist ein einzelner Operand - iota:
iota 3ergibt1 2 3(Index-Generator) - Indexierung:
x[1],x[1;2],x[](alles) undx[;3](Spalte) - Zuweisung:
x = 5(Zuweisung ist ein Ausdruck);_hält das letzte Ergebnis
Operatoren
iota 3 # 1 2 3
rho 2 3 4 # 3 (Form/Shape)
count 1 2 3 # 3 (Anzahl Elemente)
flatten 1 2 3 # 1 2 3 (Ravel)
not 1 # 0
abs -5 # 5
ceil 3.2 # 4
floor 3.8 # 3
! 5 # 120 (Fakultät)
sqrt 16 # 4
up 3 1 2 # 2 3 1 (Indizes für aufsteigende Sortierung)
Dazu kommen + - * / für Addition, Subtraktion, Multiplikation und Division (als / für Reciprocal), Vergleichsoperatoren, where, unique, box, first, last, split, mix, inv (Matrix-Inverse), rot/flip (Reversal), trigonometrische Funktionen (sin, cos, tan, atan ...) sowie real/imag für komplexe Zahlen. Spezialbefehle starten mit ), z. B. )demo und )help.
Verwandte Grundlagen: APL-Befehle, Q-Befehle, Nial-Befehle, BQN-Befehle.
BQN ist eine moderne Array-Programmiersprache, die Marshall Lochbaum ab 2020 entworfen hat („An APL for your flying saucer"). BQN führt Ken Iversons Array-Paradigma fort, ersetzt aber die schwer lesbaren APL-Symbole durch eine konsistente, Unicode-basierte Notation mit klarer Trennung von Funktionen, Modifiern und Train-Ausdrücken. Lochbaum war zuvor J-Entwickler; BQN ist seine Antwort auf Lesbarkeit und moderne Tooling-Lücken der älteren Array-Sprachen.
Einstieg
bqn # REPL starten (CBQN)
bqn prog.bqn # Datei ausführen
Wichtige Primitive
- Arithmetik:
+,-,×(Multiplikation),÷(Division),√,⋆(Potenz) — vektorisieren automatisch - Logik/Vergleich:
∧,∨,¬,≤,<,>,≥,= - Arrays:
↕(Range),∾/≍/⋈(Verknüpfen),⊑/⊏(Indizieren),↑/↓(Präfix/Suffix),⥊(Reshape) - 1-Modifier:
˜(dupliziert/tauscht),¨(Map),´(Fold),`(Scan) - 2-Modifier:
∘/○(Komposition),⊸/⟜(Hooks)
Beispiele
1 + 2 ‿ 3 ‿ 4 # 3‿4‿5 (Vektorisierung)
↕ 5 # 0‿1‿2‿3‿4 (Range, 0-basiert)
(+´÷≠) 1 ‿ 2 ‿ 3 # 2 (Durchschnitt als Train)
1 ÷ 2 + 3 # 0.2 (rechts-nach-links-Auswertung)
a ← 1 ‿ 2 ‿ 3 # Zuweisung mit ←
Negative Zahlen schreibt BQN mit Hochminus (¯1), damit das Minus nicht mit dem Subtraktionsoperator kollidiert; π und ∞ sind eingebaute Konstanten. Blöcke { ... } sind lexikalisch gescopt, Argumente heißen 𝕨/𝕩, Rekursion 𝕊. Die Referenzimplementierung ist selbst-hostend (Compiler erzeugt Bytecode); CBQN ist die schnelle C-Implementierung, daneben existieren Implementierungen in JS, Java, Rust und weiteren Sprachen.
Verwandte Grundlagen: APL-Befehle, J-Befehle, K-Befehle, Nial-Befehle, Ivy-Befehle.
SNOBOL (StriNg Oriented symBOlic Language) ist eine der ersten Programmiersprachen, die vollständig auf die Verarbeitung von Texten ausgelegt war. Entwickelt wurde sie zwischen 1962 und 1967 an den Bell Laboratories von David J. Farber, Ralph E. Griswold und Ivan P. Polonsky – mit SNOBOL4 (1967) als bekanntester und portabler Version.
Idee und Pattern Matching
Anders als bei numerisch orientierten Sprachen steht in SNOBOL das Pattern Matching im Mittelpunkt: Ein Muster beschreibt, wie ein Textausschnitt aussehen muss, und wird gegen eine Zeichenkette abgeglichen. Diese Muster können beliebig komplex zusammengesetzt werden.
* Kommentare beginnen mit * in Spalte 1
LINE = "abc123"
LINE SPAN(&LCASE) . LETTERS
OUTPUT = LETTERS
Die wichtigsten Musterfunktionen sind SPAN (alle Zeichen einer Menge fressen), BREAK (bis zu einem Zeichen der Menge), ANY (genau ein Zeichen aus der Menge) und BAL (balancierte Klammerausdrücke). Mit ARBNO lassen sich Wiederholungen ausdrücken.
Statement-Aufbau und Goto
Jede SNOBOL4-Anweisung folgt dem Schema LABEL SUBJECT PATTERN = REPLACEMENT :GOTO. Das Besondere ist der Goto-Teil: :S(erfolg) springt bei Erfolg, :F(fehler) bei Misserfolg einer Operation – eine frühe Form der bedingten Ablaufsteuerung.
OUTPUT = "Bitte Namen eingeben:"
INPUT = NAME
NAME "Maier" :S(GEFUNDEN)
OUTPUT = "Nicht gefunden" :(ENDE)
GEFUNDEN OUTPUT = "Hallo " NAME
ENDE
Mit DEFINE() definiert man eigene Funktionen, mit TABLE() assoziative Arrays. Der Operator $ erlaubt die indirekte Referenz auf Variablen.
Bedeutung und Nachfolger
SNOBOL4 wurde ab den 1970er-Jahren von Ralph Griswold an der University of Arizona weitergepflegt; freie Implementierungen wie Spitbol und CSNOBOL4 halten die Sprache bis heute am Leben. Als moderner, strukturierter Nachfolger entstand aus derselben Entwicklungslinie Icon – und daraus später Unicon.
Icon ist eine höhere, strukturierte Programmiersprache, die Ralph E. Griswold ab 1977 an der University of Arizona als modernen Nachfolger von SNOBOL4 entwarf; die erste Version erschien 1979. Icon verbindet die Textstärke von SNOBOL mit einer an Pascal und C erinnernden Syntax.
Goal-directed Evaluation
Das Herzstück von Icon ist die zielgerichtete Auswertung (goal-directed evaluation): Ein Ausdruck liefert entweder einen Wert und Erfolg oder schlägt fehl. Fehlgeschlagene Teilausdrücke lösen automatisch Backtracking aus – vergleichbar mit Prolog, aber eingebettet in eine imperative Sprache.
procedure main()
every i := 1 to 10 do
write(i)
end
Das Schlüsselwort every erzwingt alle Ergebnisse eines Generators. Auch suspend (Wert liefern und später fortsetzen) und fail (Fehlschlag melden) steuern Generatoren.
String-Scanning
Für Textarbeit bietet Icon das String-Scanning: Mit s ? expr wird eine Zeichenkette zum aktuellen Scan-Kontext, in dem Positionen untersucht und verändert werden.
procedure main()
s := "alpha,beta,gamma"
s ? {
while tab(upto(',')) do
write(tab(many(',')) | "")
}
end
Die wichtigsten Scan-Funktionen sind tab() (bis Position vorgehen und Teil zurückgeben), move() (n Zeichen), upto() (Position eines Zeichens aus einer Menge), many() (alle Zeichen einer Menge), any(), find() (Teilstring suchen) und bal() (balancierte Klammern).
Praktische Hinweise
- Strukturen:
list(),table()(assoziative Arrays),set() - Konvertierungen:
integer(),string(),cset() - Compiler
icont, Interpretericonx
Icon blieb über zwei Jahrzehnte aktiv und mündete schließlich in die objektorientierte Erweiterung Unicon.
Unicon ist eine objektorientierte Erweiterung von Icon, die seit den 1990er-Jahren an der University of Arizona entstand (maßgeblich Clinton Jeffery, später auch Ralph Griswold). Sie erweitert die zielgerichtete Auswertung und das String-Scanning von Icon um Klassen, moderne System-Schnittstellen und Netzwerkfunktionen – ohne die Icon-Programme zu brechen.
Klassen und Methoden
Unicon ergänzt Icon um class-Blöcke mit method-Definitionen und einem initially-Konstruktor. Vererbung und Polymorphismus funktionieren wie in anderen objektorientierten Sprachen.
class Point(x, y)
method print()
write("(", x, ", ", y, ")")
end
initially(x, y)
self.x := x
self.y := y
end
procedure main()
p := Point(1, 2)
p.print()
end
Erweiterte Schnittstellen
- Systemzugriff: POSIX-Prozesse, Pipes und Dateisystem-Operationen
- Netzwerk: Sockets und Protokolle für Client-/Server-Anwendungen
- Grafik: GUI-Programme mit Fenstern und Events
- Datenbanken: SQL-Schnittstellen für gängige Datenbanken
- C-Integration: Einbindung von C-Bibliotheken (Dynamic Loading)
Werkzeuge
Das Kommandozeilenwerkzeug unicon ist ein Wrapper um den Icon-Compiler icont; die Programme laufen in der Icon-Runtime iconx. Damit ist Unicon ein praktischer Einstieg, wenn man die eleganten Icon-Konzepte (Generatoren, String-Scanning) mit moderner objektorientierter Programmierung kombinieren möchte.
Die Wurzeln der Familie reichen bis SNOBOL zurück, der ersten großen String-Sprache aus den Bell Laboratories.