2013-05-27 36 views
5

我試圖鏈的一些功能Clojure中:如何鏈接多個功能?

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

是否有方便的語法糖嗎?喜歡的東西:

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

你是指comp? – 2013-05-27 12:19:31

+0

請參閱http://stackoverflow.com/questions/11918554/can-clojure-evaluate-a-chain-of-mixed-arity-functions-and-return-a-partial-funct,看看是否有幫助 – 2013-05-27 12:26:14

回答

9

使用->宏。

(-> foo f1 f2 f3 f4) 

或者reduce

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

'減少'技巧是可愛的,只是如果一個巴洛克式的:) – vemv

+2

@vemv我認爲' - >'是可愛的。 'reduce'選項清楚地顯示了操作模式,並且與線程宏不同,它很樂意在編譯時採用未知的序列。 –

5

有一個threading macro ->

(-> foo f1 f2 f3 f4) 
+0

Next Figwheel這是我今天看到的最令人敬畏的事情。 –

4

其實你的with-all-of-them描述非常接近comp,除了comp返回必須調用自己的函數:

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

因此,with-all-of-them可能是im贊成如下:

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