メモ

わからんようになってきた。他にネタが無いのでメモ。多分僕以外が見てもわからん。

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。

  • 末尾再帰除去を保証しといて、いっそのことループをなくす。

のはアリだろうか。
いや、でも、そういうのはあんまり好きじゃない。明らかにループっぽい処理をわざわざ再帰させるのは、効率とか以前に、なんか気持ち悪い。