Scilab Dynamic Scope
昨日あたりに、Emacs LispがDynamic Scopeでどうのこうの、と言う話で思い出した。Scilabは基本的に全部Dynamic Scopeだった。実際の実装の方に意識が行っていて、Dynamic Scopeという名前と結びついていなかったわけだが。
function y=sum2(x1,x2) y = x1 + x2; endfunction
と言う関数があったとして、
x2 = 10; sum2(100)
とコールすれば
ans = 110
と返ってくる。で、なんでこれがDynamic Scopeと呼ばれないかと言う問題がある。それはおそらく以下の理由だ。
function y=sum2(x1,x2) x2 = x2 * 2; y = x1 + x2; endfunction x2 = 10; sum2(100)
とやれば当然返り値は120になるわけだが、この時、呼び出し側でのx2の値は依然として
x2 = 10
のままなのだ。これはCopy on Write機構のせいだけれども、呼び出し先では呼び出し元の変数は「読めるけど書けない」。
スタック上に新しくx2という変数を作り上げてしまう。