メモ
わからんようになってきた。他にネタが無いのでメモ。多分僕以外が見てもわからん。
function () { var x; function () { loop { function () { return x }; <- closure } <- not bind } <- closure } function () { function () { loop { var x; function () { return x }; <- closure } <- need bind } <- not closure } function () { function () { loop { var x; loop { function () { return x }; <- closure } <- not bind } <- need bind } <- not closure }
とりあえず、環境を保持しない関数を「関数」、環境を保持しないといけない関数を「クロージャ」としておこう。
んで、クロージャのために、なんかしないといけないループはneed_bindフラグを付けとく。
この場合、ループにneed_bindを付ける条件はなんだろうか。
- 中のクロージャから参照される変数を持ってるループはneed_bind
で、多分大丈夫かな…?あー、うん、なんかうまくいきそう。
ややこしいのは、
function () { var x; function () { function () { function () { return x }; <- closure } <- closure } <- closure } <- not closure
関数をまたぐ参照の場合は、またいだ関数は全部クロージャになるけど、
function () { var x; loop { loop { function () { return x }; <- closure } <- not bind } <- not bind } <- not closure
ループをまたいで参照しても、またいだループはbindにはならない。
function () { loop { var x; loop { function () { return x }; <- closure } <- not bind } <- need bind } <- not closure
そのループが変数を持ってるときだけneed_bind。
- 末尾再帰除去を保証しといて、いっそのことループをなくす。
のはアリだろうか。
いや、でも、そういうのはあんまり好きじゃない。明らかにループっぽい処理をわざわざ再帰させるのは、効率とか以前に、なんか気持ち悪い。