7.1.2. Funktionsdefinitionen

???

Der Abschnitt fuzzy:Bindungen[fuzzy:Bindungen] stellt den speziellen Ausdruck defn als Bindung eines Symbols an eine Funktionsdefinition vor. Funktionen müssen jedoch keinen Namen haben, insbesondere dann, wenn Funktionen nur temporär oder lokal benötigt werden. Solche Funktionen werden 'anonyme Funktionen' genannt. In clojure wird eine anonyme Funktion mit dem Operator fn definiert:

;;; Definition einer anonymen Funktion:

(fn [x] (* x x))
=> #<user$eval7872$fn__7873 user$eval7872$fn__7873@503b27cc>

Da clojure bei der Auswertung nicht quotierter Listen als erstes Element einer Liste einen Funktionsoperator erwartet, könnte die Funktion quadrat aus dem Abschnitt fuzzy:Bindungen[fuzzy:Bindungen] auch folgendermaßen mit einer anonymen Funktion ausgeführt werden:

((fn [x] (* x x)) 4)
=> 16

Der spezielle Ausdruck defn ist im Grunde nur eine Abkürzungsnotation für den folgenden, äquivalenten Ausdruck:

;;; Funktionsdefinition mit "def"

(def quadrat (fn [x] (* x x)))
=> #'user/quadrat

(quadrat 4)
=> 16

Da bei der praktischen Arbeit mit clojure sehr häufig mit anonymen Funktionen gearbeitet wird, gibt es eine weitere Abkürzungsnotation für anonyme Funktionen. Wird einer Liste das #-Zeichen vorangestellt, wird die Liste als Definition einer anonymen Funktion interpretiert. In dieser Definition gibt es keine explizite Definition von Argumenten in eckigen Klammern. Vielmehr können Argumente der Funktion mit dem Zeichen % angesprochen werden. Die Quadratfunktion würde daher auch folgendermaßen aufgerufen werden können:

;;; Alternative Aufrufform einer anonymen Funktion:

(#(* % %) 4)
=> 16

Gibt es mehr, als ein Argument, werden die Argumente mit %1, %2, …​ angesprochen:

(#(list %1 %2) 4 5)
=> (4 5)

results matching ""

    No results matching ""