double return

ref:http://www.kmonos.net/wlog/95.html#_1109090307
を見ていて、全然関係ないけど前ちょっと考えたくだらないことを思い出しました。
しばしば return を自分で定義したくなることがあります。例えば、最初に引数を検査して、だめだったら return するとき。

# 引数を検査するメソッド
def check(*args)
  # 検査
  return bool # true or false
end

def foo(*args)
  return unless check(*args) # 検査
  # メイン処理
end

というように、引数検査する全メソッドで return unless と書いていくのが面倒だなあと思うのです。return unless を面倒がってるレベルなので、例外や throw やブロックでは解決しません (begin と rescue; end が離れた箇所に書く必要がある上に、インデントが増える) 。


そこで、こう書けたら嬉しいかなあと。

# 引数を検査するスレッド
def guard(*args)
  # 検査
  return return bool # 「return bool」というようなものを返すイメージ
end

def foo(*args)
  guard(*args) # 「return bool」というようなものが返されたらすぐ return する
  # メイン処理
end

要するに return するときにスタックフレームを何段 pop するかを指定できるようにしようぜってことなんですが、うーん我ながら気持ち悪い。バグの元か。
ちなみに return return という記法にする理由は、n 段 return するために

eval("return " * n + "bool")

という嫌なコードを書せることで、強制はしないものの推奨はしないという気分を伝えるとかどうでもいい感じのことも考えた。


もしくは、ブロックなし catch を呼んだあとに定義したメソッドは暗黙的に catch するとか。public/private みたいに。

# 引数を検査するスレッド
def guard(*args)
  # 検査
  throw(:NG) bool
end

catch(:NG) # 以下で定義するメソッドは :NG を catch する

def foo(*args)
  goard(*args)
end

うーん微妙だ。そんなことより memoize メソッドを先に作れ。