17 Jun 2010

継続でmy_while

shunsukさんの以下の記事を読んでwhileを継続で実装してみたくなった。
- [Ruby]Rubyの継続でフィボナッチ(継続の初歩)


def my_while(cond, &body)
cond = callcc{|$new_cond| cond}
body.call
cond = $new_cond.call cond if cond.call
end

i = 0
my_while lambda{i < 3} do
p i
i+= 1
end


condにはlambda{i < 3}が渡されます。&bodyには 呼び元の p i; i+=1がProcとして渡されます。
2行目: condの値に初期値として引数で渡されたcond = lambda{i < 3}がそのまま渡されます。
3行目: iをインクリメントしています。
4行目: condを実施してtrueが返る場合、condを引数にして2行目に行きます。4行目の引数のcondはそのまま2行目のcondに代入されるので、単に同じものを引き継いでいるだけです。と言うわけで継続を使う価値の半分は使ってなかったりします。(callccに移動する、値を再代入するのうち、再代入する機能を使う必要がない。)

しかし、継続は1.9.xでは廃止されたっぽいですね。残念。継続は大事ですね。

.