K.Maebashi's BBS 投稿フォーム
ハンドル名
件名
Link
>>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の >| ようなありふれた引数名は良くない)。 > >
spamよけのため、ここに「ほげぴよ」と入力してください。
削除パスワード :
クリック!