我已经看过clojure符号 - >在许多地方使用过,但我不确定这个符号被称为和做什么,甚至是否是标准clojure的一部分.有人可以向我解释一下吗?
Nic*_*zyk 26
- >使用函数调用的结果并按顺序将其发送到下一个函数调用.
所以,更简单的例子是:
(-> 2 (+ 3))
Run Code Online (Sandbox Code Playgroud)
返回5,因为它发送2,到下一个函数调用(+ 3)
建立起来,
(-> 2
(+ 3)
(- 7))
Run Code Online (Sandbox Code Playgroud)
返回-2.我们保留第一个呼叫的结果,(+ 3)并将其发送到第二个呼叫( - 7).
正如@bending所指出的,接受的答案会更好地显示doto宏.
(doto person
(.setFName "Joe")
(.setLName "Bob")
(.setHeight [6 2]))
Run Code Online (Sandbox Code Playgroud)
Phi*_*tel 13
这是一种从左到右编写代码的方法,例如
(reduce (map (map xs bar) foo) baz)
Run Code Online (Sandbox Code Playgroud)
变
(-> xs (map bar) (map foo) (reduce baz))
Run Code Online (Sandbox Code Playgroud)
您可能想要阅读源代码,它就在这里.
编辑:固定我的困惑->与->>,感谢amalloy.可悲的是,我的例子现在不太可能出现在实践中.
' - >'是一个宏.我认为,描述它的最佳方式是"点特殊形式"的例子,它的目的是使代码更简洁,更清晰,如clojure.org网站对The Dot特别说明所示.形成
(.. System (getProperties) (get "os.name"))
Run Code Online (Sandbox Code Playgroud)
扩展为:
(. (. System (getProperties)) (get "os.name"))
Run Code Online (Sandbox Code Playgroud)
但更容易编写,阅读和理解.另请参阅 - >宏,它可以类似地使用:
(-> (System/getProperties) (.get "os.name"))
Run Code Online (Sandbox Code Playgroud)
还有'doto'.假设您有一个单独的对象,您可以在其上调用几个连续的setter.你可以使用'doto'.
(doto person
(.setFName "Joe")
(.setLName "Bob")
(.setHeight [6 2]))
Run Code Online (Sandbox Code Playgroud)
在上面的示例中,setter不返回任何内容,使'doto'成为合适的选择.除非设置者返回'this',否则 - >不能代替'doto'.
所以,这些是与 - >宏相关的一些技术.我希望这不仅有助于解释他们的所作所为,也有助于他们为什么存在.
我没有完全得到什么 - >(鹅口疮或线程),直到我像这样形象化:
(-> 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
Run Code Online (Sandbox Code Playgroud)
这里有些例子:
(-> 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
Run Code Online (Sandbox Code Playgroud)