From: shugo@... (MAEDA Shugo) Date: 1998-11-23T14:21:56+09:00 Subject: [ruby-dev:3638] Re: block local variable (Re: スコープの範囲) 前田です。 >>>>> In [ruby-dev:3634] >>>>> "新井" == Koji Arai san wrote: >> あ、ひょっとしたらローカル変数の宣言を:=(もしくは::=)でしない >> といけないようにする、という提案と勘違いなさってます? 新井> そういうわけではないです。 そうですか、失礼しましたm(..)m 新井> 気になってたのは、「Rubyは、変数宣言が不要な言語」 新井> が嘘になるということ。ただそれだけ。 新井> 結局、初めての代入は暗黙の宣言だし、このことが「見 新井> ためでブロックローカルかどうかを判断できない」原因 新井> なわけだし… この場合は変数の宣言が不要なのがネガティブに働いてしまって いるわけですね。 新井> 考えていたら、前田さんの案もいいように思えてきまし 新井> た。(新しい仕様は受け入れるのに時間がかかるモノで 新井> す ^^;) ありがとうございます:-) 新井> 一応、"_" で始まる変数なら、|v,_v| のように、ブロッ 新井> クローカルにするかどうかを制御できる利点があること 新井> は言っておこう。 確かに僕の案ではこれはできませんね。 でも_だと普通の識別子なので、他の記号の方が良いような気がします。 僕の案の延長で|i:, j:|とするとブロックローカルになるようにするとか。 # 文法が破綻しそうな気が(^^; 新井> := が採用されれば、イテレータに新たなスコープを導 新井> 入しない件も採用すべきでしょうね。(その方がわかり 新井> やすい) 問題は原さんも指摘されてるように文法を変えすぎという ことですが(^^; 新井> あとは、互換性の問題か。普通なら、 新井> 現在 提案 新井> iter { 新井> v = 0 宣言 宣言 新井> .... 新井> } 新井> v = 0 宣言 代入 新井> イテレータの後に必ず代入文があるはずだから、問題な 新井> さそうなんですが。 >> ブロック内変数は >> Thread固有変数 >> 手続きオブジェクト固有変数 >> などのために必要なものです. 新井> この点が気になる。私は、Threadもprocもまだ未経験な 新井> のでよくわからないのですが、:= への書き直しが必要 新井> になるんでしょうね。(これの元記事ってどこですか?) 例えば、 loop do ns = @server.accept Thread.start do while command = ns.read(1) # 何でgetcじゃなくてread(1)なの?>私 ... end end end みたいなコードだとnsが各スレッドで共有されてしまうので動作が おかしくなります。 これは ns = @server.accept Thread.start do s = ns while command = s.read(1) ... のようにブロックローカルな変数に値を移すことで解決できます。 僕の案が採用されれば、これは ns = @server.accept Thread.start do ns := ns while command = ns.read(1) ... と書くことになります。 上の場合だとブロックの外側でsが定義されているかどうか気に しないといけないのですが、下の場合ではその必要はなくなります。 Procオブジェクトの場合は、ブロックの実行が遅延されることで、 似たような問題が起こります。 p = proc { foo = 0 } foo = 1 p.call ブロックローカルな変数がないと、fooが破壊されてしまいます。 # こちらは現実的な例を思いつきませんでした。 # Procの場合はThreadと組み合わせないかぎりあまり問題にならないのかも。 -- 前田 修吾 (mailto:shugo@aianet.ne.jp)