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という変数を作り上げてしまう。