2009-01-04

and-let*

モナド的な何かに向かってを見て、when-bindみたいなマクロなら、Gaucheにもありそうだと思って探したところ、やっぱりあった。

SRFI 2で提案されているand-let*がそうで、

(let ((the-value (func-which-returns-useful-value-or-#f)))
  (if the-value
    (do-something-based-on the-value)))

こういう処理を、

(and-let* ((the-value (func-which-returns-useful-value-or-#f)))
  (do-something-based-on the-value))

こう書ける。条件式が減らせて見通しも良くなる。

なお、束縛する変数がひとつの場合、例によって、if-let1というGauche独自のマクロがあり、

(if-let1 the-value (func-which-returns-useful-value-or-#f)
  (do-something-based-on the-value))

のように書ける。

ただ、and-let*にしても、if-let1にしても、変数への束縛がある分、参照元の>>=より冗長になってしまうので、そういうパターンがかなりの頻度で現われるなら、束縛まで省略できる手続きを自分で定義した方が良いかもしれない。Haskellを知らない自分としては、>>=だと分かりづらいから、and-composeとかだろうか。

0 件のコメント: