2017-05-22 11 views
8

io!ブロックはClojureで使用されるでしょうか?私はその目的を理解するのに苦労している。ioの実用は何ですか? Clojureのブロック?

+0

決してそれを使用しませんでしたが、機能/コードがトランザクションで使用されないように強制する方法のようです。 – Carcigenicate

+1

興味深い質問...メーリングリストをすばやく検索しました。[ワンスレッド](https://groups.google.com/d/msg/clojure/ZZP93tVmot4/DoDBAlDrHmYJ)と[another](https:// groups .google.com/d/msg/clojure/TAhNp7rb2Go/Kij920UDKbwJ)、特に[導入されたスレッド](https://groups.google.com/d/msg/clojure/JRRegOOwohE/3gWZjmWClpUJ) [コミット](https://github.com/clojure/clojure/commit/c5e8c6f06292fab26d29cb951d8400394e0f8258))。 – glts

+0

ありがとう@glts非常に便利なリンク。次の2つの答えがうまくまとめられていると思います。「明示的にio!コールを使ってコードを囲むように他のコードを停止すると思う。 その宣言的な方法:私はioをやっている! 「副作用コードを誤ってトランザクションで使用できないようにマークすることがポイントです。」 – Aspasia

答えて

5

これはSTMシステムの一部ですensuring that code related to IO is not used inside STM transactions.トランザクションが実行されている間に別のスレッドが矛盾したデータをコミットすると、clojureはトランザクションを再試行するため、そのトランザクションによって生成されたIOはメモリの状態を表すため、捨てられた。

+1

[source](https://github.com/clojure/clojure/blob/clojure-1.9.0-alpha14/src/clj/clojure/core.clj#L2485)を見ると、トランザクションが進行中の場合は例外をスローします。それ以外の場合は、通常通りに本体を実行します。 –

+0

これは参考になりますが抽象的です。あなたが実際に使っているシナリオの例:あなたがIOをするいくつかの関数、ユーザに知られているもの、ユーザにとって未知のものを持つパッケージを書いているとします。彼らが安全でない方法で(つまりトランザクション内で)使用されている場合には、これらのすべてがスローされ、エラーになるためには '(io!&body)'を使用してください – jaimedash

+1

は過去7年間clojureで働いており、一般的な例はありません。 –

関連する問題