2013-05-27 4 views
5

私はチェーンにClojureの中にいくつかの関数をしようとしている:複数の機能をチェーンするにはどうすればいいですか?

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

は、このための任意の便利なシンタックスシュガーはありますか?ような何か:

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

あなたはcompを意味しますか? –

+0

http://stackoverflow.com/questions/11918554/can-clojure-evaluate-a-chain-of-mixed-arity-functions-and-return-a-partial-functを参照してください。それがあなたに役立つかどうかを確認してください。 –

答えて

9

使用マクロ->

(-> foo f1 f2 f3 f4) 

またはreduce

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

'reduce'トリックはちょっとバロックのようにかわいいです:) – vemv

+2

@vemv' - > 'はかわいいと思います。 'reduce'オプションは操作パターンをはっきりと示し、スレッドマクロとは異なり、コンパイル時には未知のシーケンスを取ることができます。 –

5

threading macro ->があります:

(-> foo f1 f2 f3 f4) 
+0

Figwheelこれは真剣に私が今日見た中で最も素晴らしいものです。 –

4

実際with-all-of-themのあなたの説明は、あなたが自分自身を呼び出す必要があります関数を返すcompことを除いて、compに非常に近いです:

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

したがって、with-all-of-themは、

(defn with-all-of-them [arg & fs] 
    ((apply comp fs) arg)) 
関連する問題