17 Jun 2010

継続でmy_while

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

  1. def my_while(cond, &body)   
  2.   cond = callcc{|$new_cond| cond}  
  3.   body.call  
  4.   cond = $new_cond.call cond if cond.call  
  5. end  
  6.   
  7. i = 0  
  8. my_while lambda{i < 3} do  
  9.   p i  
  10.   i+= 1   
  11. 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では廃止されたっぽいですね。残念。継続は大事ですね。

.