2016-10-28 9 views
3

抽象的な問題:

私は一連の計算をしています。いずれのステップも失敗する可能性があります。ステップが失敗した場合は、プロセス全体をメッセージで中止する必要があります。Clojure、Haskellのいずれかのモナド、および失敗する計算シーケンス

ハスケル解決策:

どちらか+ IO Monads。

(既知の)Clojureのソリューション:

  1. スロー例外。
  2. 使用のClojure/algo.monads

質問:

は私が知っておくべきことが他のソリューションはありますか?この問題に対する標準的な「Clojure Way」は何ですか?

具体例私はに実行している:私はClojureScript経由のWebGLでセットアップGLSLシェーダにhttps://github.com/kovasb/gammaを使用してい

  1. VertexShaderオブジェクト
  2. コンパイルVertexShaderを割り当てます。典型的なプログラムのようなものが含まれます。
  3. FragmentShaderオブジェクトを割り当てます。
  4. コンパイルフラグシェーダ
  5. 割り当てオブジェクト。
  6. リンクプログラム
  7. 使用プログラム

  8. VertexBufferObjectsに

  9. アップロードVertexBufferObjectデータを割り当てTextureObject
  10. アップロードテクスチャ
  11. セットアップ制服を割り当てます。
  12. 実際に電話をかける。

    これらのステップのいずれかが失敗することがあり、エラーを取得するには、

    を(シェーダがコンパイルされません、これ以上BufferObjectsは...など、間違ったフォーマットを左)、失敗した場合に、私は他のすべてを終了させたい、とそれを修正する。これを処理する典型的な "Clojure Way"は何ですか?私はそれはあなたの特定の状況に適用される場合、some->マクロは、多くの場合、失敗する可能性がある計算の順序のためにClojureの中で使用されている(ここで、「失敗はわからないものの

答えて

0

最も簡単な方法は、Java例外を使用することです。しかし、エラーと処理をキャッチします。

小さな改良はwith-exception-defaultfrom the Tupelo library.に使用例を使用することであるので、のようなものである:

(with-exception-default 666 
    (Long/parseLong "123")) 
;=> 123 

(with-exception-default 666 
    (Long/parseLong "12xy3")) 
;=> 666 
1

(Haskellでは、それはEitherT IOモナドなります) "=" return nil ")。

+1

これはニートマクロあります。もし私が間違っていれば私を訂正しなさい - いくつかはargをNEXT FORMに渡しますが、私はそれをキャプチャできません。つまり、 "x < - f(); y < - g(); z < - h(x、y) "は動作しません。なぜなら、hになるとyを渡すだけで、xは失われるからです。 –

+1

'some->'と 'as-' 'を組み合わせて見ることができます:https://clojuredocs.org/clojure.core/as-%3E#example-568eeddae4b0f37b65a3c280 –

関連する問題