【发布时间】:2026-01-14 02:05:02
【问题描述】:
我正在学习 Clojure,遇到了这个例子:
(defn people-in-scenes [scenes]
(->> scenes
(map :subject)
(interpose ", ")
(reduce str)))
->> 究竟做了什么?
【问题讨论】:
标签: clojure
我正在学习 Clojure,遇到了这个例子:
(defn people-in-scenes [scenes]
(->> scenes
(map :subject)
(interpose ", ")
(reduce str)))
->> 究竟做了什么?
【问题讨论】:
标签: clojure
->> 是“最后线程”宏。它评估一个表单并将其作为 last 参数传递给下一个表单。
您的代码相当于:
(reduce str (interpose ", " (map :subject scenes)))
或者,换个角度看:
(reduce str
(interpose ", "
(map :subject scenes)))
阅读 clojure 代码时,几乎必须从“内向外”或“自下而上”进行。线程宏允许您以更合乎逻辑的顺序阅读代码。 “拿东西,先做这个,再做那个,然后……”。
【讨论】:
我发现阅读Clojure cheatsheet(和ClojureScript cheatsheet)很有帮助。这些有语言中所有常用函数的列表。当然,附加库中还有很多其他功能。
另见->,它将函数作为第二个参数传递到下一个形式。
【讨论】:
以下产生相同的结果
(->> 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)
【讨论】: