Domain Specific Language

Domain Specific Language

Clojure eignet sich hervorragend zum Erstellen von sogenannten Domain Specific Languages (DSLs). Dank der homoikonischen Syntax und der Möglichkeit, Code als Daten zu behandeln, kannst du eigene Mini-Sprachen definieren, die genau auf deine Anwendung zugeschnitten sind.

Vorgehensweise

  • Ziel definieren: Was willst du beschreiben? (z. B. HTML, SQL, Routing, Formulare)
  • Datenstruktur wählen: Meist Vektoren oder Maps für Klarheit und Kombinierbarkeit
  • Makros oder Funktionen nutzen: um lesbaren Code zu erzeugen
  • Optional: Makros, wenn du wirklich Sprachsyntax verändern willst

Clojure-DSLs bleiben oft “Embedded DSLs” – also normale Clojure-Funktionen mit domänenspezifischen Namen, keine völlig neue Syntax.

Aufgabe: Schreibe eine kleine DSL, die HTML erzeugt.

Lösung

Statt HTML als String zu bauen, definieren wir eine Mini-DSL für HTML-Elemente:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
(defn html [& body]
  (str "<html>" (apply str body) "</html>"))

(defn h1 [text]
  (str "<h1>" text "</h1>"))

(defn p [text]
  (str "<p>" text "</p>"))

;; Nutzung:
(println
 (html
   (h1 "Willkommen")
   (p "Dies ist eine Mini-DSL für HTML.")))

Das erzeugt: <html><h1>Willkommen</h1><p>Dies ist eine Mini-DSL für HTML.</p></html>