Clojure中的->>是什么意思?

13

我正在学习Clojure,并遇到了这个例子:

  (defn people-in-scenes [scenes]
     (->> scenes
         (map :subject)
         (interpose ", ")
         (reduce str)))

->> 这个操作符到底是干什么用的?

3个回答

14

->>是“thread-last”宏。它评估一个表单并将其作为最后参数传递到下一个表单中。

你的代码等同于:

(reduce str (interpose ", " (map :subject scenes)))

或者,用另一种方式来看:

(reduce str
            (interpose ", "
                            (map :subject scenes)))

阅读Clojure代码时,几乎必须从“内向外”或从“底部向上”进行阅读。线程宏允许您按照某些人所说的更逻辑的顺序阅读代码。“获取某些内容,首先对其执行此操作,然后执行此操作,接下来执行...”。


3
我发现阅读Clojure cheatsheet(和ClojureScript cheatsheet)对编程很有帮助。这些内容列出了语言中所有常用的函数。当然,还有很多其他函数在额外的库中。
另外,请注意->,它将函数作为第二个参数传递到下一个表单中。

1
以下内容产生相同的结果。
(->> 10
    (range)
    (filter odd?)
    (map #(* 2 %))
    (reduce +))

第一种写法是指按照这个顺序依次执行这些操作。第二种写法则是从左到右读作“对小于10的奇数进行加倍,然后求和”。
(reduce + (map #(* 2 %) (filter odd? (range 10))))

如果你来自javascript或C#,第一个例子读起来像是在javascript中使用linq或点链接。

range(10).filter(odd)
         .map(x => x * 2)
         .reduce((a,b) => a + b)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接