【问题标题】:Macros -> ->> in ClojureClojure 中的宏 -> ->>
【发布时间】:2015-11-16 23:36:56
【问题描述】:

->->> 宏只是为了使代码更具可读性还是还有其他特定功能?

【问题讨论】:

    标签: clojure macros


    【解决方案1】:

    线程优先 (->) 和线程后 (->>) 可以使代码更具可读性。但这已经很重要了!

    它允许取消嵌套函数调用(示例取自clojuredocs):

    ;; Arguably a bit cumbersome to read:
    user=> (first (.split (.replace (.toUpperCase "a b c d") "A" "X") " "))
    "X"
    
    ;; Perhaps easier to read:
    user=> (-> "a b c d" 
               .toUpperCase 
               (.replace "A" "X") 
               (.split " ") 
               first)
    

    它还可以让你把重点放在某事上。例如,考虑:

    (-> {... }
        ...
        ...
        (count)) 
    
    (count (...(... {...})))
    

    在第一个例子中,很明显你从一张地图开始,然后对它做一些事情。在第二个中,很明显你在数一些东西。

    偏好取决于您要提出的内容。

    此外,->->> 的选择是一个清晰的视觉指标:您是否在收藏品上运营?这很明显(这是 Clojure 中将集合作为最后一个参数的约定)。

    所以是的,它是“唯一的”可读性,但这是构建程序的一个非常重要的部分,Clojure 为您提供了使您的代码自然阅读的工具。在选择一种解决方案时,我会尽量考虑the way Clojure will be read

    【讨论】:

    • 还值得注意的是,有一系列相关的条件线程宏确实在其之上添加了额外的功能。 some->some->> 线程第一个和最后一个如上所述,但如果任何步骤返回 nil,则停止评估,这可能是单子。 cond->cond->> 测试一个条件来决定是否通过每个线程表单传递值。
    • @nha 谢谢,现在很清楚了!顺便说一句,我在阅读您的好答案时遇到了一个新问题:方法名称之前的点是否表示 java 方法? (在.replace.toUpperCase)调用java方法与clojure库之间有什么区别或好处:(clojure.string/replace)(clojure.string/upper-case)
    • @AmirTeymuri 很高兴你喜欢它 :) 是的,这些是 Java 方法(我只是从 clojuredocs 中举了一个例子,但是是的,Clojure 方法更惯用)。此外,当调用不在 Clojure 命名空间中的 Java 方法时,您可能对 doto 宏感兴趣。
    • 当它真的更像是“管道”时,为什么将它命名为“线程”?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-09
    • 1970-01-01
    • 2023-03-19
    相关资源
    最近更新 更多