【问题标题】:What does ->> mean in Clojure?->> 在 Clojure 中是什么意思?
【发布时间】:2026-01-14 02:05:02
【问题描述】:

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

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

->> 究竟做了什么?

【问题讨论】:

    标签: clojure


    【解决方案1】:

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

    您的代码相当于:

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

    或者,换个角度看:

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

    阅读 clojure 代码时,几乎必须从“内向外”或“自下而上”进行。线程宏允许您以更合乎逻辑的顺序阅读代码。 “拿东西,先做这个,再做那个,然后……”。

    【讨论】:

      【解决方案2】:

      我发现阅读Clojure cheatsheet(和ClojureScript cheatsheet)很有帮助。这些有语言中所有常用函数的列表。当然,附加库中还有很多其他功能。

      另见->,它将函数作为第二个参数传递到下一个形式。

      【讨论】:

        【解决方案3】:

        以下产生相同的结果

        (->> 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)
        

        【讨论】:

          最近更新 更多