2013-05-27 13 views
5

Próbuję łańcucha kilka funkcji w Clojure:Jak łańcuchować wiele funkcji?

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

Czy istnieje wygodny cukier składnię tego? Coś jak:

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

czy masz na myśli komp? –

+0

zobacz http://stackoverflow.com/questions/11918554/can-clojure-evaluate-a-chain-of-mix- -functions- and-return--partial-funct i zobacz, czy to ci pomoże –

Odpowiedz

9

Zastosowanie -> makro.

(-> foo f1 f2 f3 f4) 

Albo reduce:

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

Sztuczka 'reduce' jest urocza, tylko jeśli trochę barokowa :) – vemv

+2

@vemv Myślę, że' -> 'jest urocze. Opcja 'reduce' wyraźnie pokazuje wzorzec operacyjny i, w przeciwieństwie do makra wątku, z przyjemnością przyjmuje sekwencję nieznaną podczas kompilacji. –

5

Jest threading macro ->:

(-> foo f1 f2 f3 f4) 
+0

Obok Figwheel to naprawdę najbardziej niesamowita rzecz, jaką widziałem dzisiaj. –

4

Właściwie Twój opis with-all-of-them jest bardzo blisko comp, z wyjątkiem tego comp zwraca funkcję, należy zadzwonić pod:

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

Tak, with-all-of-them może być im plementowane w następujący sposób:

(defn with-all-of-them [arg & fs] 
    ((apply comp fs) arg)) 
Powiązane problemy