2013-05-27 16 views
5

Ich versuche, ein paar Funktionen in Clojure der Kette:Wie mehrere Funktionen verketten?

(f4 (f3 (f2 (f1 foo)))) 

Gibt es eine bequeme Syntax Zucker für das? Etwas wie:

(with-all-of-them foo f1 f2 f3 f4) 
+1

meinst du comp? –

+0

siehe http://stackoverflow.com/questions/11918554/can-clojure-evaluate-a-chain-of-mixed-arity-functions-and-return-a-partial-funct und sehen, ob das Ihnen hilft –

Antwort

9

Verwenden -> Makro.

(-> foo f1 f2 f3 f4) 

Oder reduce:

(reduce #(%2 %1) foo [f1 f2 f3 f4]) 
+0

Der 'reduce' Trick ist süß, nur wenn ein bisschen barock :) – vemv

+2

@vemv Ich denke das' -> 'ist niedlich. Die 'reduce'-Option zeigt deutlich das Betriebsmuster und ist, im Gegensatz zum Threading-Makro, glücklich, eine zur Kompilierungszeit unbekannte Sequenz zu übernehmen. –

5

Es gibt eine threading macro ->:

(-> foo f1 f2 f3 f4) 
+0

Neben Figwheel das ist wirklich das großartigste was ich heute gesehen habe. –

4

Eigentlich Ihre Beschreibung von with-all-of-them-comp ganz in der Nähe ist, außer dass comp gibt eine Funktion, die Sie selbst nennen müssen:

(f4 (f3 (f2 (f1 foo)))) == ((comp f4 f3 f2 f1) foo)

Also, with-all-of-them könnte im sein plementiert wie folgt:

(defn with-all-of-them [arg & fs] 
    ((apply comp fs) arg)) 
Verwandte Themen