2013-05-27 14 views
5

Sto cercando di catena di alcune funzioni in Clojure:Come concatenare più funzioni?

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

C'è un comodo zucchero sintassi per questo? Qualcosa di simile:

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

intendi comp? –

+0

vedere http://stackoverflow.com/questions/11918554/can-clojure-evaluate-a-chain-of-mixed-arity-functions-and-return-a-partial-funct e vedere se questo ti aiuta –

risposta

9

Usa -> macro.

(-> foo f1 f2 f3 f4) 

O reduce:

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

Il trucco 'reduce' è carino, solo se un po 'barocco :) – vemv

+2

@vemv Penso che' -> 'sia carino. L'opzione 'reduce' mostra chiaramente il modello operativo e, a differenza della macro di threading, è felice di assumere una sequenza sconosciuta in fase di compilazione. –

5

C'è un threading macro ->:

(-> foo f1 f2 f3 f4) 
+0

Successivo a Figwheel questa è davvero la cosa più bella che ho visto oggi. –

4

In realtà la tua descrizione di with-all-of-them è molto vicino al comp, tranne che comp restituisce una funzione che è necessario chiamare te stesso:

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

Quindi, with-all-of-them potrebbe essere im completato come segue:

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