[#39989] TCPSocket.new でスレッドが止まる。 — take_tk <ggb03124@...>

たけ(tk)です。

15 messages 2004/09/02

[#40018] yaml.rbとdate.rbを組み合わせて使った際の問題 — "Keisuke Minami" <keisuke@...>

こんにちは。三並と申します。

14 messages 2004/09/07
[#40020] Re: yaml.rbとdate.rbを組み合わせて使った際の問題 — IWATSUKI Hiroyuki <don@...> 2004/09/07

岩月と申します。

[ruby-list:40002] Re: ruby/tk のイベントハンドラをまとめて設定するには?

From: Yukihiro Matsumoto <matz@...>
Date: 2004-09-03 04:57:26 UTC
List: ruby-list #40002
まつもと ゆきひろです

In message "Re: [ruby-list:40001] Re: ruby/tk   のイベントハンドラをまとめて設定するには?"
    on Fri, 3 Sep 2004 12:06:51 +0900, H.Yamamoto <ocean@m2.ccsnet.ne.jp> writes:

|>>      let(TkcRectangle.new(self, 100 + h, 100 + h, 200 + h, 200 + h, :fill => :white)) {|r|
|>>        r.bind "ButtonPress-1", proc { p r.id }
|>>      }
|
|色々考えたんですが、しっくりくるものがなくて、難しいです。
|
|  1. let を予約語にしてしまう
|
|        r = TkcRectangle.new(self, 100 + h, 100 + h, 200 + h, 200 + h, :fill => :white)
|        let r
|           r.bind "ButtonPress-1", proc { p r.id }
|        end
|
|        r = TkcRectangle.new(self, 100 + h, 100 + h, 200 + h, 200 + h, :fill => :white)
|        r.bind "ButtonPress-1", let r { proc { p r.id } }

私が考えているのはこんな感じです。

  let {|r|
    r = TkcRectangle.new(self, 100 + h, 100 + h, 200 + h, 200 + h, :fill => :white)
    r.bind "ButtonPress-1", proc { p r.id }
  }

|  2. ブロックローカルにするような宣言をつくる
|
|       r = TkcRectangle.new(self, 100 + h, 100 + h, 200 + h, 200 + h, :fill => :white)
|       r.bind "ButtonPress-1", proc { p `r.id }

これは「`」がブロックローカルマークですか? 残念ながらその記
号は使われています。ブロックローカル変数には別のprefixを使う
というのはなかなか魅力的なアイディアですが、もう記号が残って
いないような気がします。「\」は使ってないけど...。

それに特別な記号を使う場合にはそのままではネストに対応できま
せんね。一つ上の外側のネストのブロックローカル変数に対応する
場合には「\\foo」とかするのは避けたいです。

|       r = TkcRectangle.new(self, 100 + h, 100 + h, 200 + h, 200 + h, :fill => :white)
|       r.bind "ButtonPress-1", proc with r do p r.id end

こちらはブロックパラメータ中ににローカル宣言を付加するもので
すね。以前出たものでは||の中に

  loop{|a; b,c,d|...}

で「aはブロックパラメータ(ブロックローカル)」かつ「b,c,dは
ブロックローカル」という案がありました。結局、そんなことしな
くても

  loop{|a| let{|b,c,d|...}}

でいいじゃん、という気になって採用していませんが。

|       r = TkcRectangle.new(self, 100 + h, 100 + h, 200 + h, 200 + h, :fill => :white)
|       r.bind "ButtonPress-1", proc r->{ p r.id }

えーと、Perl6風味ですね。ブロックローカル変数について検討し
ていた時にはこれは考えていなかったのですが、単純に考えると
(Perl6同様)「r」は単なるブロックローカルというよりもブロック
パラメータになるのではないかと思います。

|なんて書きましたが、ブロック引数もブロックローカルでないのが一番わかりやすいような
|気もしてきて、よくわかりません。

その辺は私に任せてくださったほうがよいかもしれません。

                                まつもと ゆきひろ /:|)

In This Thread