2012-09-19 15 views
5

Ich habe einen Vektor von Funktionen (def my-func [a b c d]). Jede Funktion übernimmt die Ausgabe der letzten Funktion als Eingabe. Ich möchte eine Eingabe durch sie einfädeln, wie mache ich das?Threading durch einen Vektor von Funktionen

Wie komme ich zum folgenden Formular (-> in a b c d)?

Danke, Murtaza

Antwort

5

können Sie comp verwenden, aber beachten sie die Funktionen richtig ausführt

((comp d c b a) 10) 

nach links oder

((apply comp my-fns) 10) 

wird 10 an die erste Funktion übergeben, das Ergebnis an die nächste Funktion und so weiter.

+0

Danke für die elegante Lösung Schmied. – murtaza52

+0

Gern geschehen. Es gibt eine andere Funktion, ['juxt'] (http://clojuredocs.org/clojure_core/clojure.core/juxt), die eine Reihe von Funktionen als Argumente übernimmt und die Argumente auf jede Funktion anwendet, die einen Vektor von Ergebnissen zurückgibt ((juxt + - * /) 3 2) => [5 1 6 3/2] ' –

5

Ich glaube, Sie die reduce Funktion verwenden können:

(def fns [inc inc inc]) 
(reduce (fn [v f] (f v)) 10 fns) 
+0

Dank dAni, das ist ein wunderbarer Weg! – murtaza52

+0

Das erinnert mich daran, was @ Fogus in der [Soor in Clojure sprach] (http://blog.fogus.me/2010/09/28/thrush-in-clojure-redux/) –

Verwandte Themen