whileの返値のなぞ
前エントリによりlispと比較しながらrubyのwhileの謎を追究してみる(若干)
lisp(gosh)の場合は以下のように、if,whileともに最後に評価した式の値を返す。
gosh> (if #t 'true 'false) true gosh> (if #f 'true 'false) false gosh> (while #f 'dammy) #t
ところが、rubyの場合はifの時は最後に評価した式の値なのだがwhileはnilが返ってくる。
何故なんだろう。
irb(main):001:0> if true then "true" else "false" end => "true" irb(main):002:0> if false then "true" else "false" end => "false" irb(main):003:0> while false ; "dammy" ;end => nil
ひょっとしたらbreakのせいかも。
irb(main):004:0> while true ; break ; end => nil
ちなみにbreakには値がない。訳が分かりません。
lispのbreakに相当するものとして継続(call/cc)があるらしい(ホントはクロージャーのより上位な抽象概念らしい)が難しくて中止。
http://user.ecc.u-tokyo.ac.jp/~t50473/onlispjhtml/index.html
惜しいTeXのコンバート失敗してなかったら読んだのに(笑