clojure - Clojure 中的宏 -> ->>

标签 clojure macros

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

最佳答案

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

它允许取消嵌套函数调用(示例取自 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 (...(... {...})))

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

偏好取决于你想提出什么。

还有,选择->对比 ->>是一个清晰的视觉指示器:您是否对集合进行操作?这很明显(这是 Clojure 中的约定,将集合作为最后一个参数)。

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

关于clojure - Clojure 中的宏 -> ->>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32167178/

相关文章:

windows - Windows 上的 Clojure IDE?

c++ - iMacro 查找元素

c - __func__ 标识符如何构成安全风险?

ruby - Ruby 中的宏?

scala - 用宏写数组填充

macros - 用 Clojure + Midje 重新定义宏操作

binding - 将向量作为绑定(bind)传递给 for 宏时出现问题

clojure - 为什么许多 Clo​​jure 函数是可变参数的?

clojure - 如何在不使用 :reload? 的情况下重新评估 clojure "def"

Clojure:何时使用可变状态