メモ
わからんようになってきた。他にネタが無いのでメモ。多分僕以外が見てもわからん。
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。
- 末尾再帰除去を保証しといて、いっそのことループをなくす。
のはアリだろうか。
いや、でも、そういうのはあんまり好きじゃない。明らかにループっぽい処理をわざわざ再帰させるのは、効率とか以前に、なんか気持ち悪い。