什么 - >在clojure?

时间:2011-01-02 16:13:40

标签: clojure

我看过clojure符号 - >在许多地方使用过,但我不确定这个符号被称为和做什么,甚至是否是标准clojure的一部分。有人可以向我解释一下吗?

6 个答案:

答案 0 :(得分:25)

- >使用函数调用的结果并按顺序将其发送到下一个函数调用。

所以,更简单的例子是:

 (-> 2 (+ 3))

返回5,因为它发送2,到下一个函数调用(+ 3)

建立起来,

(-> 2 
  (+ 3) 
  (- 7))

返回-2。我们保留第一个呼叫的结果,(+ 3)并将其发送到第二个呼叫( - 7)。

如@bending所述,接受的答案可能会更好地显示doto宏。

(doto person
  (.setFName "Joe")
  (.setLName "Bob")
  (.setHeight [6 2]))

答案 1 :(得分:13)

这是一种从左到右而不是从内到外编写代码的方法,例如

(reduce (map (map xs bar) foo) baz)

成为

(-> xs (map bar) (map foo) (reduce baz))

您可能需要阅读来源,它是here

编辑:由于合金化,修复了->->>的混淆。可悲的是,我的例子现在不太可能出现在实践中。

答案 2 :(得分:7)

' - >'是一个宏。我认为,描述它的最佳方式是“点特殊形式”的例子,它的目的是使代码更加简洁易读,如clojure.org网站对{{3 }}

(.. System (getProperties) (get "os.name"))

扩展为:

(. (. System (getProperties)) (get "os.name"))

但更容易编写,阅读和理解。另见 - >可以类似地使用的宏:

(-> (System/getProperties) (.get "os.name"))

还有'doto'。假设您有一个单独的对象,您可以在其上调用几个连续的setter。你可以使用'doto'。

(doto person
  (.setFName "Joe")
  (.setLName "Bob")
  (.setHeight [6 2]))

在上面的示例中,setter不返回任何内容,使'doto'成为合适的选择。 - >除非设定者返回“这个”,否则不会取代'doto'。

所以,这些是与 - >相关的一些技术。宏。我希望这不仅有助于解释他们的所作所为,也有助于解释他们存在的原因。

答案 3 :(得分:7)

我没有完全得到什么 - > (鹅口疮或线程)直到我把它想象成这样:

(-> expr f1 f2 f3)  ;same as (f3 (f2 (f1 expr)))

(-> expr            ;same as form above
    f1              ;just a different visual layout
    f2
    f3)

;this form is equivalant and shows the lists for f1, f2, f3.
(->         expr     ; expr treaded into first form
        (f1     )    ;  |   result threaded into next form
    (f2          )   ;  |   and so on...
(f3               )) ;  V   the lists (f1

(f3 (f2 (f1 expr)))  ;the result is the same as this  

以下是一些例子:

(-> 41 inc dec inc)   ;same as (inc (dec (inc 41)))
42

(->            41     ;same as above but more readable
          (inc   )
     (dec         )
(inc               ))
42

(inc (dec (inc 41)))  ;easier to see equivalence with above form.
42

(-> 4 (* 4 3) (- 6))  ;same as (- (* 4 3 4) 6)
42 

(->   4               ;      4
   (*   3 4)          ;   (* 4 3 4)
(-           6))      ;(- (* 4 3 4) 6)
42

(- (* 4 3 4) 6)       ;easier to see equivalence with above form.
42

答案 4 :(得分:1)

你可以亲眼看看:

(macroexpand `(-> 42 inc dec))

答案 5 :(得分:0)

它被称为鹅口疮运营商。最好的解释是here