Homoikonizität

Posted by in clojure, funktionale Programmierung

Die letzten Monate habe ich damit verbracht zwei neue Programmiersprachen zu lernen. Eine davon ist Clojure, das mich schon seit meiner Studienzeit interessiert hat. Leider hatte ich damals noch nicht einmal Java gelernt und so blieb mir die eigenartige Syntax und das funktionale Programmierparadigma mehr oder weniger verschlossen.

In nächster Zeit werde ich immer wieder über Konzepte schreiben, die diesen Sprachen zugrunde liegen, um mir selbst darüber klar zu werden, was sie denn eigentlich bedeuten. Sollten sich Fehler einschleichen, können diese gerne angemeckert werden 🙂

Homoikonizität

Was ist denn eigentlich Homoikonizität? Im Grunde genommen ist damit nur gemeint, dass sämtlicher Programmcode in einer Datenstruktur der jeweiligen Sprache geschrieben ist. Nehmen wir als Gegenbeispiel mal eine einfache Java-Klasse.

Kann man diese Klasse in einer Datenstruktur aus Java darstellen ohne auch nur ein Zeichen zu verändern? Offensichtlich nicht.

Sehen wir uns dazu eine Clojure-Funktion an

Listen werden in Clojure mit () umschlossen. Also ist die Funktionsdefinition sum eine Liste mit dem Inhalt def, sum, [x y] und (+ x y).

Ein kleines Beispiel

Ein kleines Beispiel in der REPL soll das verdeutlichen. Jedesmal wenn man dort etwas eingibt wird vesucht der Ausdruck als S-Expression dazu zu evaluieren. In Clojure kann deshalb ein quote vorangestellt werden, um das zu verhindern.

Und was hat man davon?

Es gibt einige Dinge die man anstellen kann, wenn man eine homoikonioide Sprache verwendet. Allen voran ist wohl das Metaprogrammieren zu nennen.

In diesem einfachen Postfix Beispiel wird ein Makro vorgestellt, das das aktuelle Pogramm so verändert, dass es ausgeführt werden kann:

Es gibt natürlich noch mehr Möglichkeiten, aber zu diesen bin ich noch nicht vorgedrungen 😉