タグ

2017年2月5日のブックマーク (2件)

  • CRubyで末尾最適化を使った再帰 - yarbの日記

    Schemeなんかと違って、言語としてのRubyは末尾最適化(Tail Call Optimization)の実装は必須ではないけど、処理系としてのCRubyは2.0.0からオプション扱いで入っている、という話。2012年の6月ごろにはMatzさんはTCOをデフォルトにするという考えもあったようだけど、ここにある議論によれば、Ruby 2.0系のマイナーバージョンまで先延ばしになった模様。性急にTCOを入れなかった理由は、 バックトレースを失うので一般的なRuby利用者に影響が大きい set_trace_func()のサポートが大変 文法。ちゃんとドキュメントに落としこむのが難しい。これは半分冗談、半分気 ということらしい。JRubyでも、JVMがサポートしない限り実装が難しいという(あれ? Clojureは明示的な末尾呼び出しの最適化をやってるように思うけど)。 Rubyはイテレータで

    CRubyで末尾最適化を使った再帰 - yarbの日記
    takc923
    takc923 2017/02/05
  • Rubyは末尾呼び出し最適化をサポートしている - Camera Obscura

    Ruby でこれはスタックオーバーフローします。 def add(n, a = 0) return a if n.zero? add(n - 1, n + a) end puts add(10000) #=>a.rb:2:in `add': stack level too deep (SystemStackError) 例えばこう対策します。 obelisk.hatenablog.com 上のとおり以前に Ruby で末尾再帰のスタックオーバーフローを避ける方法を書いたのですが、『アンダースタンディング コンピュテーション ―単純な機械から不可能なプログラムまで』を読んでいたら、Ruby は末尾呼び出し最適化(Tail Call Optimization)をサポートしているとの驚くべき記事があった(p.45 )。このブログ記事にも書かれている。こんな感じでやればいいようだ。 tco = <

    Rubyは末尾呼び出し最適化をサポートしている - Camera Obscura
    takc923
    takc923 2017/02/05
    ruby、一応末尾再帰最適化する機能持ってるみたいやけど使いづらすぎわろた