Concurrent Clean : do記法

エラーハンドリングでcase文を使うことの繁雑さを解消したい。

func u = with u do
           Pass a <- funcPassOrFail 123
             catch e = return e
           b <- process a
           return (a,b)
         finally
           _ <- close

と書くと、

func u = `finally0 (`0 u)
  where
    `0 u # (`r0,u) = funcPassOrFail 123
         = case `r0 of
             Fail e = (e,u)
             Pass a = `1 a u
    `1 a u # (b,u) = process a u
           = ((a,b),u)
    `finally0 (`r0,u) # (_,u) = close u
                      = (`r0,u)

となる、みたいな。
tryがたくさん続くようなときとかはどうなるのかなぁ。
もう少し考える。

      • -

withは予約語だった。

      • -

関数をわけると、スコープが難しいなあ。