言語ゲーム

とあるエンジニアが嘘ばかり書く日記

Twitter: @propella

クロージャとオブジェクトは同じ物だという話

前に lambda lifting という言葉を聞いてから、ずっと妄想しているのは、クロージャとオブジェクトは「似ている」のではなく「同じ物」なのではないかという事。lambda lifting というのはクロージャコンビネータに変形する操作の事で、多分簡単に書けば

function f() {
    var a = 1
    return function() { return a * 2 }
}

のような関数を

function g(env) {
    return env.a * 2;
}
function f() {
    var a = 1
    return g({a: 1});
}

のように書き直してスコープをまたがる a のような変数アクセスを無くす事だと思います。で、これなんかに似てるなーと思ったら、オブジェクト指向言語のメソッドにそっくりです。pythonperl のような言語ではレシーバを第一引数に書きますが、これは、javascript みたいに暗黙に定義された this を lambda lifting していると考える事が出来ます。

という事で、クロージャの環境とオブジェクト言語のレシーバを同じ物だと見なす事で、より美しい言語が出来るのでは無いかと考えています。ただ、オブジェクトには同じ関数でもオブジェクトによって別の関数実体が呼ばれるメソッドディスパッチがあるので簡単には行きません。この辺もうちょっと考えます。

追記

id:SaitoAtsushi さんにそのままズバリの記事を教えて頂いたのでリンクを貼ります。これは面白いです!