2013-05-27 34 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))