STM并改变clojure

Mat*_*ggs 4 clojure stm

我正在编写"Clojure编程"一书.在解释alter和STM时,他们说如果在更改期间,Clojure检测到来自事务外部的ref的更改,它将使用新值重新运行事务.如果是这种情况,我会想象你传递的更新函数需要是纯粹的,但是文档中没有指出(并且它在其他类似的情况下).

我的假设是正确的吗?如果没有,STM如何重新应用该功能?如果它是正确的,那么您是否可以依靠文档告诉您何时可以产生副作用,何时不能?

ama*_*loy 8

它不一定是纯粹的,它必须是幂等的.在实践中,这基本上是一回事.

此外,它只需要在STM之外看到是幂等的:如果您产生的唯一副作用是写入其他参考或(我认为)发送给代理,那么该操作将一直持续到您的事务成功为止.

事实并非如此,它必须是以下任何一种情况:只是,如果您的更新功能不纯,结果可能不是您所期望的.

编辑:dosync的文档告诉你,身体中的任何表达都可能被执行多次.如果alter没有运行a dosync,你就无法运行,所以看起来你需要的所有文档都在那里.你想改变什么?