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