Clojure Tutorial, Teil 4: Organisation in Dateien


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.

Weitere Artikel

Video Thumbnails unter Windows erstellen

Eindrücke aus Red Dead Redemption 2

Neuer Bluray Player: PS4

How to hardware reset the new Oura ring

Neuer Monitor: Dell S2716DG

Ein paar Bilder

Endlich da: Mein Oura Ring

Quick changelog with git

Pik Ass in Destiny 2

Neue Drohne: DJI Mavic Air