什么 - >在clojure中做什么?

Zub*_*air 23 clojure

我已经看过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)

  • 这是不准确的.2不会被发送到`(+ 3)`的函数调用...而是宏重新排列代码从`( - > abc)`到`(c(ba))` (6认同)

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.可悲的是,我的例子现在不太可能出现在实践中.

  • 这在一般性方面是正确的,但在具体方面是错误的.你已经描述了` - >>`的行为,而不是` - >`.你提供的样本会扩展为`(reduce(map(map xs bar)foo)baz)`,因为` - >`穿过*second*位置,而不是*last*(这就是` - >>` ). (2认同)

Psy*_*llo 7

' - >'是一个宏.我认为,描述它的最佳方式是"点特殊形式"的例子,它的目的是使代码更简洁,更清晰,如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'.

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

  • 你的二传手都归还了吗?如果没有,那么你会想要使用(doto ...) (6认同)

dan*_*lmo 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  
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)