своп! изменить и так - PullRequest
       2

своп! изменить и так

4 голосов
/ 17 июня 2010

У меня проблемы с пониманием того, как эти функции обновляют базовый ref, атом и т. Д.

В документах сказано: (применить f аргументы current-value-of-identity)

(def one (atom 0))
(swap! one inc) ;; => 1

Так что мне интересно, как он «расширился» до формы заявки.Не указано, что именно означает «args» в форме заявки.Это последовательность аргументов или это отдельные значения?

Было ли оно "расширено" до:

(apply inc 0) ; obviously this wouldnt work, so that leaves only one possibility
(apply inc 0 '())


(swap! one + 1 2 3) ;; #=> 7

Было ли это:

(apply + 1 1 2 3 '()) ;or
(apply + 1 [1 2 3])

(def two (atom []))
(swap! two conj 10 20) ;; #=> [10 20]

Было ли это:

(apply conj [] [10 20]) ;or
(apply conj [] 10 20 '())

1 Ответ

6 голосов
/ 17 июня 2010

Отрывок, который вы процитировали из строки документации swap!, означает, что происходит эквивалент обмена новым значением для атома, полученным из старого с (apply f old-value args), где args является последовательностью всех дополнительных аргументы переданы swap!.

То, что на самом деле происходит, отличается, но это только деталь реализации. Ради любопытства: у Atoms есть метод Java под названием swap, который перегружен, чтобы принимать от одного до четырех аргументов. Первым всегда является IFn (f передается swap!); второй и третий, в настоящее время, являются первыми двумя дополнительными аргументами этого IFn; четвертый, если он есть, представляет собой ISeq дополнительных аргументов за пределами первых двух. apply никогда не используется, и случаи фиксированной арности даже не вызывают IFn applyTo метод (они просто используют invoke). Это повышает производительность в общем случае, когда не слишком много дополнительных аргументов передается swap!.

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