我正在学习Clojure,我遇到了这个例子:
(defn people-in-scenes [scenes]
(->> scenes
(map :subject)
(interpose ", ")
(reduce str)))
->>
到底做了什么?
答案 0 :(得分:11)
->>
是"线程最后"宏。它评估一个表单并将其作为 last 参数传递到下一个表单。
您的代码相当于:
(reduce str (interpose ", " (map :subject scenes)))
或者,以不同的方式看待它:
(reduce str
(interpose ", "
(map :subject scenes)))
当阅读clojure代码时,几乎必须从"里面外出"或者从"自下而上。"线程宏允许您以某些人所说的更符合逻辑的顺序读取代码。 "拿东西,首先做到这一点,接下来做,接下来......"。
答案 1 :(得分:2)
我发现阅读torazaburo(和Clojure cheatsheet)很有帮助。它们包含该语言中所有常用功能的列表。当然,其他库中还有很多其他功能。
另见->
将函数作为第二个参数传递给下一个表单。
答案 2 :(得分:0)
以下内容产生相同的结果
(->> 10
(range)
(filter odd?)
(map #(* 2 %))
(reduce +))
第一个被写成这样,然后被写成那个。第二个从左到右读取为“总和小于10的双倍奇数”。
(reduce + (map #(* 2 %) (filter odd? (range 10))))
如果您来自javascript或C#,则第一个示例的内容类似于linq或javascript中的点链。
range(10).filter(odd)
.map(x => x * 2)
.reduce((a,b) => a + b)