>P85の補足「各言語のグローバル変数の扱い」のPerlの部分に「localとかmyとかを
>付けて宣言するとローカル変数となる。」とあります。
>しかし、Cやjavaをおもに使っている人にとってlocalがローカル変数というのは
>かなり違和感があると思います。
確かにPerlのlocalはダイナミックスコープですから、CやJavaのローカル変数とは
挙動が異なります。とはいえグローバル変数とも明確に違うものだと思います。
以下のサンプルで、きっぱり再帰できていますし。
==================================================
&hoge(0);
sub hoge {
my $depth = shift;
#print 'depth..' . $depth;
if ($depth > 2) {
return;
}
local $i;
for ($i = 1; $i <= 3; $i++) {
print ' ' x $depth . '$i..' . $i . "\n";
hoge($depth + 1);
}
}
==================================================
私の感覚だと、ダイナミックスコープの変数は、自分自身とそこから呼び出された
関数からしか見えないという点でローカルだと思うのですが、確かに単に
「localとかmyとかを付けて宣言するとローカル変数となる。」とだけ書いて
しまうのは確かに乱暴かもしれません。まあでもここはPerl, Ruby, PHPそれぞれの
言語の特徴をさらりと書いているだけのところなので、正誤表に載せるような
ことではないのでは、と思います。
後日、補足記事をWebに上げようかと思います。
>myがない頃はlocalが使われていたそうですが、なぜmyより先にlocalが作られた
>のでしょう?
過去のある一時点において、多くの人が「ダイナミックスコープかっこいい!」と
思ったことがある、ということなのではないでしょうか。
http://hagi.is.s.u-tokyo.ac.jp/pub/essay/hagiya/h/tensai
| 僕は、Schemeの開発こそ、コンピュータ・サ
| イエンスの典型的なセンスの一つではないかと
| 思うのである。それまでは、LISPの考案者
| McCarthyのまやかしともいえる「変数の動的な
| スコープ」に、皆がだまされ続けていたわけで
| ある。
http://www.rubyist.net/~matz/20041025.html#p01
| 歴史的にはLispは(少なくともインタプリタ処理系では)、ダイナミックスコープが
| 当たり前だったのだが、SchemeやCommonLisp以来すっかりスタティックスコープの
| 言語になってしまっている。ダイナミックスコープなら外側のローカル変数もごく
| 自然に見える。変数名の重複にだけ気をつければ良い(そういう意味ではcondやcommの
| ようなありふれた引数名は良くない)。