; closures.clj (defn zaehlerMitStartwert [startwert] (let [zaehler (atom startwert)] (fn [] (swap! zaehler inc)))) (def next1 (zaehlerMitStartwert 10)) (def next2 (zaehlerMitStartwert 20)) (println (next1)) ;; 11 (println (next2)) ;; 21 (println (next2)) ;; 22 (println (next1)) ;; 12
In der Funktion
zaehlerMitStartwert
wird im let
-Block ein lokales Binding für zaehler
angelegt. Der Wert von zaehler
ist ein Atom mit dem übergebenen startwert
. Ein Atom speichert in Clojure einen Zustand, der threadsicher ausgetauscht werden kann. Rückgabe von zaehlerMitStartwert
ist eine Funktion ohne Parameter: (fn [] ...)
- dies ist die Closure, die die freie Variable zaehler
außerhalb der Closure-Funktion bindet (umschließt). Die Closure-Funktion verändert (swap!
t) den zaehler
-Wert mithilfe der inc
-Funktion und gibt den neuen (reingeswap!
ten) Wert zurück.
Dann definieren wir zwei globale Variablen
next1
und next2
, die mit je einer Closure-Instanz initialisiert werden. Diese Funktionen werden mit der Clojure- bzw. Lisp-typischen Syntax (next1)
aufgerufen (statt next1()
o.ä.).