Homoiconicity
Homoikonizität (oder oder Selbst-Repräsentierbarkeit) bezeichnet die Eigenschaft einiger Programmiersprachen, dass Programme gleichzeitig Datenstrukturen derselben Sprache sind. Jedes Clojure-Programm ist zugleich eine valide edn- Datenstuktur und kann ohne weiteres serialisiert werden.
Beispiel: Der (zugegeben simple) mathematische Ausdruck (+ (* 2 3) (- 3 1))
beschreibt eine Liste mit drei Elementen: dem Symbol + sowie zwei weiteren Listen (nennen wir sie l1 und l2). l1 enthält drei Symbole: +, 2 und 3. l2 enthält auch drei Symbole: -, 3 und 1.
Diese Verschachtelung von Symbolen entspricht folgenden Baum (Klammern nicht dargestellt, sondern beschreiben die Tiefe der Schachtelung):
+
/ \
* -
/ \ / \
2 3 3 1
Ebenso ist die Definition einer Liste mittels (def my-list (list (1 2 3)))
letztlich folgender Baum:
def
/ \
my-list list
/ | \
1 2 3
Oder die Definition einer Funktion (def my-add (fn [a b] (+ a b)))
(eine Clojure-spezifische Ausnahme ist hier der Vektor, welche die Parameter gruppiert - in CommonLisp werden auch Parameter als Liste übergeben):
def
/ \
my-add fn
/ \
[a b] +
/ \
a b
Alle Ausdrücke sind syntaktisch Baumstrukturen und somit valide Daten - ein weiteres Schlagwort dafür lautet Code as Data.
Um Datenstrukturen zu evaluieren, besitzt der LISP-Interpreter folgende Anweisung:
Das erste Element einer Liste beschreibt den Namen der zu evaluierenden Funktion - alle weiteren Elemente sind Parameter der Funktion.
Ein LISP ist somit definiert anhand seiner Evaluationsstrategie, nicht seiner Syntax. Dies wird unter anderem später interessant sein für die Makros.