Что делает -> делает в ближайшем будущем? - PullRequest
23 голосов
/ 02 января 2011

Я видел символ clojure ->, используемый во многих местах, но я не уверен, как этот символ называется и что делает, или даже является ли он частью стандартного clojure. Может ли кто-нибудь объяснить мне это?

Ответы [ 6 ]

26 голосов
/ 22 июля 2011

-> использует результат вызова функции и последовательно отправляет его на следующий вызов функции.

Итак, более простой пример:

 (-> 2 (+ 3))

Возвращает 5, поскольку он отправляет 2, к следующему вызову функции (+ 3)

На этом основании

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

Возвращает -2.Мы сохраняем результат первого вызова (+ 3) и отправляем его на второй вызов (- 7).

Как отмечает @bending, в принятом ответе было бы лучше показать макрос doto.

(doto person
  (.setFName "Joe")
  (.setLName "Bob")
  (.setHeight [6 2]))
13 голосов
/ 02 января 2011

Это способ написать код слева направо, а не наизнанку, например,

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

становится

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

Возможно, вы захотите прочитать источник, это здесь .

РЕДАКТИРОВАТЬ: Исправлена ​​моя путаница -> с ->>, благодаря амальлой.К сожалению, мой пример сейчас вряд ли появится на практике.

7 голосов
/ 15 августа 2012

Я не получил полностью то, что -> (дрозд или нить) сделал, пока не представил это так:

(-> 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
7 голосов
/ 02 января 2011

'->' - это макрос.Я думаю, что лучший способ описать это в примере «точечной специальной формы», для которой он служит для того, чтобы сделать код более кратким и разборчивым, как указано в объяснении на веб-сайте clojure.org.Специальная форма Dot

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

расширяется до:

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

, но ее легче писать, читать и понимать.См. Также макрос ->, который можно использовать аналогичным образом:

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

Также есть 'doto'.Допустим, у вас есть один объект, для которого вы хотите вызвать несколько последовательных сеттеров.Вы можете использовать «doto».

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

В приведенном выше примере сеттеры ничего не возвращают, делая «doto» соответствующим выбором.-> не будет работать вместо «doto», если сеттеры не вернут «this».

Итак, это некоторые методы, связанные с макросом ->.Я надеюсь, что это поможет объяснить не только то, что они делают, но и почему они существуют.

1 голос
/ 21 августа 2012

Вы можете убедиться сами:

(macroexpand `(-> 42 inc dec))
0 голосов
/ 02 января 2011

Это называется оператором молочницы. Лучше всего объяснить здесь .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...