2016-05-25 11 views
2

Я пытаюсь написать очень простой код, который показывает разные результаты между коммутированием и изменением в Clojure. Может ли кто-нибудь создать пример для этой цели?В чем разница между коммутированием и изменением в Clojure?

Проще лучше понять разницу.

+1

Я не думаю, что это не по теме. Он просит пример, но может быть так же сформулирован, как «В чем разница между коммутированием и изменением? Может ли кто-нибудь показать мне функцию, которая демонстрирует, что они ведут себя по-другому?» – amalloy

+1

Я согласен, что это действительный и явно не повторяющийся вопрос. Нелегкий ответ приходит на ум, потому что они оба всегда дают одинаковый ответ, просто делайте это в разное время, иногда. –

ответ

1

Предполагая, что commute используется правильно, не должно быть никакой разницы в наблюдаемых значений работах, за исключением тех случаев, как использование commute может помочь совершить сделку в высоком конкурирующей сценарии, где это было бы трудно сделать с alter. Конечно, когда это применимо, это довольно значительная разница в результатах ...

Проще проиллюстрировать, как вещи отличаются от побочных эффектов. Вот однопоточный пример, чтобы проиллюстрировать основное свойство, что

  • alter будет называться именно один раз в «операции попытку» (возможно, только один раз),

  • commute будет называться именно один раз в «сделки try "(в то время как commute не приведет к их возникновению, он может быть задействован в повторных попытках, если в одном и том же блоке используется dosync), а затем один последний раз, чтобы вычислить зафиксированное значение (так, по крайней мере, дважды, но опять же, это не приведет к повторным попыткам):


user=> (def r (ref nil)) 
#'user/r 
user=> (dosync (alter r prn)) 
nil 
nil 
user=> (dosync (commute r prn)) 
nil 
nil 
nil 

Использования некоторых Thread/sleep с и несколько нитей можно спровоцировать больше повторные попытки на alter стороны в то же время наблюдения двух повторных попыток на commute стороны, исследовать влияние на реф истории использования один или другой и т. д.