4

私はProgrammingClojureの本を読んでいます。とSTMを説明alterしている間、彼らは、変更中に、Clojureがトランザクションの外部からrefへの変更を検出した場合、新しい値でトランザクションを再実行すると言います。その場合、渡す更新関数は純粋である必要があると思いますが、それはドキュメントには示されていません(他の同様の状況でも同様です)。

だから私の仮定は正しいですか?そうでない場合、STMはどのように機能を再適用しますか?それが正しければ、いつ副作用が発生する可能性があるのか​​、いつ発生しないのかをドキュメントに頼ることができないのは事実ですか?

4

3 に答える 3

8

厳密に純粋である必要はなく、べきである必要があります。実際には、これは基本的に同じことです。

さらに、STMの外部で見た場合にのみべき等である必要があります。生成する唯一の副作用が他の参照への書き込みまたは(私が思うに)エージェントへの送信である場合、その操作はトランザクションが成功するまで保持されます。

また、これらのいずれかである必要があるというわけでもありません更新関数が純粋でない場合、期待どおりの結果が得られない可能性があります。

編集:dosyncのドキュメントによると、本文内の式は複数回実行される可能性があります。alterを実行せずにを実行することはできないdosyncため、必要なすべてのドキュメントがそこにあるように見えます。何を変えたいですか?

于 2011-03-25T02:13:15.120 に答える
4

補足として:

STM変換にログインするなどの副作用を実行する必要がある場合は、エージェントにメッセージを送信して、べき等でない部分を実行できます。エージェントに送信されるメッセージは、トランザクションが終了したときにのみディスパッチされ、1回だけ送信されることが保証されています。

于 2011-03-25T05:50:08.257 に答える
1

Clojureのポイントは、トランザクションを処理するときに副作用がないことです。これは、トランザクションが一貫しているためです。共有値の更新中に競合が見つかった場合、関数は再実行されます(再試行することをお勧めします)。変更を正常にコミットします。再試行する必要がある場合は、更新された値を読み取るため、副作用はありません。発生する可能性のある問題はLivelockですが、Clojureからの再試行の制限数によって制御されます。

于 2011-12-11T21:51:51.963 に答える