50

Clojure中的->和宏有什么区别?->>

4

1 回答 1

88

文档 A. Webb 链接以解释“什么”,但没有做好“为什么”的工作。

通常,当函数作用于单个主题时,该主题是第一个参数(例如conj,, assoc)。当函数作用于序列主题时,该主题是最后一个参数(例如map,, filter)。

因此,->->>分别记录为第一个和最后一个参数的线程,但将它们分别应用于单数或连续参数也很有用。

例如,我们可以将向量视为奇异对象:

(-> [1 2 3]
  (conj 4)         ; (conj [1 2 3] 4)
  (conj 5)         ; (conj [1 2 3 4] 5)
  (assoc 0 0))     ; (assoc [1 2 3 4 5] 0 0)
=> [0 2 3 4 5]

或者我们可以将其视为一个序列:

(->> [1 2 3]   
  (map inc)        ; (map inc [1 2 3])
  (map inc)        ; (map inc (2 3 4))
  (concat [0 2]))  ; (concat [0 2] (3 4 5))
=> (0 2 3 4 5)
于 2013-10-11T13:23:42.950 回答