Clojure Tutorial, Teil 4: Organisation in Dateien
Von Carsten
Dies ist der vierte Artikel in einer kleinen Serie, die meine ersten Schritte in der neuen funktionalen Programmiersprache Clojure dokumentieren soll. Die Artikel werden in unregelmäßigen Abständen hier publiziert.
Bei der Arbeit mit Clojure ist das Standardvorgehen zur Organisation von Sourcecode das Aufteilen von logischen Einheiten von Funktionen in einzelne Dateien. Die Namespaces der Funktionen sollten diese logische Zusammengehörigkeit wiederspiegeln. Ich habe das ganze mal am Beispiel einer sehr einfachen HTML-Bibliothek ausprobiert.
Datei 1: Hauptprogramm im Namespace FitbitClj.core
(ns FitbitClj.core
(:use compojure.core
compojure.handler
ring.adapter.jetty
ring.middleware.reload
ring.middleware.stacktrace
FitbitClj.html))
; define compojure routes
(site (defroutes test-routes
(GET "/" {params :params}
(str (h1 "Testing") (debug (h2 "params") params)))
(ANY "*" []
{:status 404, :body "Page not found."})
))
(def app
(-> (var test-routes)
(wrap-reload '(FitbitClj.core))
(wrap-reload '(FitbitClj.html))
(wrap-stacktrace))
)
(defn dev []
(run-jetty #'app {:port 8080})
)
Wie man sieht, verwende ich hier Funktionen wie h1
oder debug
, um mir ein einige Ausgaben auf einer Webseite anzusehen. Diese Funktionen sind kein Teil von Clojure oder Compojure, sondern selbstgeschrieben und in der Datei FitbitClj/html.clj
gespeichert.
Datei 2: HTML-Bibliothek im Namespace FitbitClj.html
(ns
#^{:author "Carsten Ringe"
:doc "Simple HTML formatting"}
FitbitClj.html)
(defn h1
([heading] (str "<h1>" heading "</h1>")))
(defn h2
([heading] (str "<h2>" heading "</h2>")))
(defn debug
([heading elem] (str heading "<pre>" elem "</pre>")))
Damit ist mein Hauptprogramm übersichtlich, während das langatmige Erzeugen des HTML-Markups aus dem Blickfeld versteckt ist.