タグ

ブックマーク / obelisk.hatenablog.com (2)

  • Ruby の lambda は第一級オブジェクト(だと思う) - Camera Obscura

    JavaScript の関数は第一級オブジェクト(第一級関数)だとよく言われますね。変数に代入できるし、関数の引数にすることができるし、関数の戻り値にすることもできます。以下のとおりです。 function a() { console.log("Hello!"); } function f(x) { x(); } a(); //=>"Hello!" var b = a; b(); //=>"Hello!" f(b); //=>"Hello!" function g() { return function () {console.log("Hello, world!");}; } var c = g(); c(); //=>"Hello, world!" じつは Rubylambda は、上で JavaScript の関数がやっていることをすべて行うことができます。 a = lambd

    Ruby の lambda は第一級オブジェクト(だと思う) - Camera Obscura
    takc923
    takc923 2017/03/26
  • 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、一応末尾再帰最適化する機能持ってるみたいやけど使いづらすぎわろた
  • 1