Clojure > Archives > 2010/05/23

2010/05/23 00:35:11 UTCleque
#
例外ハンドラはプログラムの実行順序に合わせて動的に設定されるのに対して、遅延評価だと実行順序が曖昧になってしまうからですね
#
少し話はそれますけど、 Functional Reactive Programming だと例外をどう中断して復帰するべきなのかよくわからないという話を思い出しました
#
Haskell だとどうしているんだろう
2010/05/23 04:33:58 UTCfatrow
#
遅延評価には付き物の問題なんですね。
2010/05/23 05:36:33 UTCfatrow
#
user> (def a (map #(/ 10 %) [1 2 0 4]))
#'user/a
#
例外が起きる遅延シーケンスから、
#
(10 5 #<ArithmeticException java.lang.ArithmeticException: Divide by zero> 5/2)
#
のように例外を捕捉済みのシーケンスを作りたいんですけど、どうやればいいでしょうか?
2010/05/23 08:59:27 UTCleque
#
単純に (try (doall a) (catch ...)) だと例外ハンドラの戻り値が doall の値になっちゃうんですね
#
user=> (try (doall a) (catch java.lang.Exception e e))   
#<RuntimeException java.lang.RuntimeException: java.lang.ArithmeticException: Divide by zero>
#
promise に例外ハンドラがくっついてきてくれればいいんでしょうけど
2010/05/23 09:16:19 UTCleque
#
あれ
#
これって map の引き数の関数の中で例外を補足しないといけないんじゃないでしょうか
#
user=> (map (fn [x] (try (/ 10 x) (catch java.lang.Exception e e))) [1 2 0])
(10 5 #<ArithmeticException java.lang.ArithmeticException: Divide by zero>)
#
実際に例外があがるのは map に渡された手続きの dynamic extent 中なので
#
前の方のコードを少し読み違えてました。
2010/05/23 10:15:26 UTCfatrow
#
ありがとうございます。やっぱり、根っこの関数の中じゃないとcatchできないですかね。元の遅延シーケンス a はもう変更できないという前提だと無理なのかなぁ。