[#25808] break & retry in block — Shin-ichiro HARA <sinara@...>

原です。

15 messages 2005/03/04

[#25812] Re: [ruby-cvs] ruby/test/ruby, ruby/test/logger, ruby/sample, ruby/misc, ruby/lib/xmlrpc, ruby/lib/wsdl/soap, ruby/lib/rexml, ruby/lib/rdoc/parsers, ruby/lib/rdoc/generators, ruby/lib/irb, ruby/lib, ruby/ext/zlib, ruby/ext/win32ole, ruby/ext/tk, ruby/ext/strscan, ruby/ext/socket, ruby/ext/readline, ruby/ext/pty, ruby/ext/openssl, ruby/ext/iconv, ruby/ext/etc, ruby/ext/dl, ruby/ext/curses, ruby/ext/bigdecimal, ruby/ext/Win32API, ruby: * array.c: replace rb_protect_inspect() and rb_inspecting_p() by — Tanaka Akira <akr@...17n.org>

In article <20050304064753.53859C671F@lithium.ruby-lang.org>,

3 messages 2005/03/06

[#25853] conflict method and local variable — Hidetoshi NAGAI <nagai@...>

永井@知能.九工大です.

56 messages 2005/03/10
[#25854] Re: conflict method and local variable — Yukihiro Matsumoto <matz@...> 2005/03/10

まつもと ゆきひろです

[#25855] Re: conflict method and local variable — Hidetoshi NAGAI <nagai@...> 2005/03/10

永井@知能.九工大です.

[#25856] Re: conflict method and local variable — Yukihiro Matsumoto <matz@...> 2005/03/10

まつもと ゆきひろです

[#25857] Re: conflict method and local variable — Hidetoshi NAGAI <nagai@...> 2005/03/11

永井@知能.九工大です.

[#25858] Re: conflict method and local variable — Yukihiro Matsumoto <matz@...> 2005/03/11

まつもと ゆきひろです

[#25861] Re: conflict method and local variable — Hidetoshi NAGAI <nagai@...> 2005/03/11

永井@知能.九工大です.

[#25863] Re: conflict method and local variable — Yukihiro Matsumoto <matz@...> 2005/03/11

まつもと ゆきひろです

[#25864] Re: conflict method and local variable — Hidetoshi NAGAI <nagai@...> 2005/03/11

永井@知能.九工大です.

[#25865] Re: conflict method and local variable — Yukihiro Matsumoto <matz@...> 2005/03/11

まつもと ゆきひろです

[#25866] Re: conflict method and local variable — Hidetoshi NAGAI <nagai@...> 2005/03/11

永井@知能.九工大です.

[#25869] Re: conflict method and local variable — Shugo Maeda <shugo@...> 2005/03/13

前田です。

[#25875] Re: conflict method and local variable — Yukihiro Matsumoto <matz@...> 2005/03/13

まつもと ゆきひろです

[#25878] Re: conflict method and local variable — Hidetoshi NAGAI <nagai@...> 2005/03/13

永井@知能.九工大です.

[#25882] Re: conflict method and local variable — Yukihiro Matsumoto <matz@...> 2005/03/13

まつもと ゆきひろです

[#25884] Re: conflict method and local variable — Hidetoshi NAGAI <nagai@...> 2005/03/14

永井@知能.九工大です.

[#25885] Re: conflict method and local variable — Yukihiro Matsumoto <matz@...> 2005/03/14

まつもと ゆきひろです

[#25888] Re: conflict method and local variable — Shugo Maeda <shugo@...> 2005/03/14

前田です。

[#25946] ext/tk/sample/**/*.gif are broken — "H.Yamamoto" <ocean@...2.ccsnet.ne.jp>

山本です。

16 messages 2005/03/27

[#25959] some trouble on ext/tk/sample — "H.Yamamoto" <ocean@...2.ccsnet.ne.jp>

山本です。

20 messages 2005/03/29
[#25969] Re: some trouble on ext/tk/sample — Hidetoshi NAGAI <nagai@...> 2005/03/30

永井@知能.九工大です.

[#25970] Re: some trouble on ext/tk/sample — "H.Yamamoto" <ocean@...2.ccsnet.ne.jp> 2005/03/30

山本です。

[#25973] Re: some trouble on ext/tk/sample — Hidetoshi NAGAI <nagai@...> 2005/03/31

永井@知能.九工大です.

[ruby-dev:25855] Re: conflict method and local variable

From: Hidetoshi NAGAI <nagai@...>
Date: 2005-03-10 16:49:17 UTC
List: ruby-dev #25855
永井@知能.九工大です.

From: Yukihiro Matsumoto <matz@ruby-lang.org>
Subject: [ruby-dev:25854] Re: conflict method and local variable
Date: Thu, 10 Mar 2005 22:58:13 +0900
Message-ID: <1110463090.896650.7511.nullmailer@x31.priv.netlab.jp>
> 少なくとも意図的です。ただし、実験的導入なので最終確定かどう
> かは分かりません。これはlambdaが代入されたローカル変数を(普
> 通の関数における)関数のように取り扱うためのものです。

すみません.
その議論の際にはあまり理解できてなくて素通りしてました.

> 今までのプログラムで動かないものがでるのでつらい部分があるこ
> とも理解できますが、どこがどうつらいのか、どうあるべきかにつ
> いてもう少し聞かせてもらえませんか。

「どうあるべき」などと偉そうなことは言えませんが,
最初に問題にぶつかったのは widget demo での次の部分で,
-------------------------------------------------------------------
def invoke (txt, idx)
  tag = txt.tag_names(idx).find{|t| t.kind_of?(String) && t =~ /^demo-/}
  return unless tag
  cursor = txt.cget('cursor')
  txt.cursor('watch')
  Tk.update
  eval IO.readlines("#{[$demo_dir, tag[5..-1]].join(File::Separator)}.rb").join
  Tk.update
  txt.cursor(cursor)

  $tag_visited.add("#{idx} linestart +1 chars", "#{idx} lineend +1 chars")
end
-------------------------------------------------------------------
ここから呼び出される $demo_dir/twind.rb でエラーを生じて
正常に動かないという状況が生じました.

# 上記のコードは cursor 変数の値が eval の中で書き換えられる恐れがある
# という問題もあるわけですが,そこは置いておくとして.(^_^;

twind.rb のどこかが悪いのかと思い,widget demo から twind.rb の
ソースを表示して再実行すると正常に動く.
で,よくよく調べてみると,twind.rb の中の
-------------------------------------------------------------------
TkTextWindow.new($twind_text, 'end', 
                 'window'=>TkButton.new($twind_text) {
                   text 'オン'
                   command proc{textWindOn $twind_text,$twind_buttons}
                   cursor 'top_left_arrow'
                 })
-------------------------------------------------------------------
としている部分が問題だったというわけです.
eval の直前で cursor という変数をつかっていたばっかりに
eval されるコードの中で instance method を呼び出すことが
できなくなってしまっています.

# 実際には Ruby/Tk では method_missing を使っているわけですが.

これまでは呼び出される側 (twind.rb) では変数アクセスだけに
注意していれば良かったわけですが,今後はレシーバを省略しての
呼び出しにもファイルを跨いで注意を払わねばいけないことになります.
これまでは変数名とメソッド名とはほぼ別集合として考えることが
できていたのに対し,今後は変数名とメソッド名とを一つの集合として
考えねばならならないということですよね?

メソッド呼び出し毎にチェックするのは大変ですので,安全を図るには
-------------------------------------------------------------------
TkTextWindow.new($twind_text, 'end', 
                 'window'=>TkButton.new($twind_text) {
                   self.text 'オン'
                   self.command proc{self.textWindOn $twind_text,$twind_buttons}
                   self.cursor 'top_left_arrow'
                 })
-------------------------------------------------------------------
というように,常にレシーバを省略しないで書くしかなさそうです.

管理しなければならない名前の集合が大きくなってしまうことと,
レシーバの省略が危なっかしくて使いづらくなることとを考えると
少々辛いなぁと感じてしまいます.

# 私だけ...?
-- 
                                       永井 秀利 (九工大 知能情報)
                                           nagai@ai.kyutech.ac.jp

In This Thread