けいじゅ@今はフリー(^^;;;です. 

これはこれで, 実現するかどうかはともかく, もうちょっと深めたいのでつき
あって下さい.

In [ruby-list :03419 ] the message: "[ruby-list:3419] Re: meta
programming features ", on Jul/24 07:34(JST) matz / netlab.co.jp
(Yukihiro Matsumoto) writes:

>|  a = "Foo"
>|  proc{|a| a = "Bar"}.call
>|  print a

>ちゃいます.この場合 a は(イテレータブロックの外で代入されて
>いるので)常に静的ローカル変数です.ですから,この結果は
>
>=======================
>  Bar
>
>です.動的ローカル変数とは「イテレータブロックの中で最初に代
>入された変数」のことです.

あ. そうでした. この場合は, パラメータとして|a|しているけど, 静的ロー
カル変数の`a'と同じものになるんですね?

>|別のものですか... 
>
>evalに渡す文字列はrubyプログラムですが,"|a| A = a"は完全な
>rubyプログラムではありませんから.たとえば,
>
>  ruby -ce "|a| A = a"
>
>してみれば分かると思いますが.

ああ. なるほど. それはそうですね.

そういう意味では, 

ruby "print ARGV.inspect" "foo"

は実現できるので,

  eval "print ARGV.inspect", a_binding, "foo"

みたいな方法は可能かな? 変数名はARGVじゃない方が良いとは思いますが.

>|うーん. なるほど... ところで, バインディングってどんなオブジェクトなん
>|です? 
>
>構造はProcと同じです.

BindingはProcのスーパクラスなのかな? 

>ちなみにProcをbindingとして渡しても動作します.Procはイテレータがスタッ
>ク上に持っている情報をオブジェクト化したもので,だいたい以下のような
>ものを持っています.

>  * 静的ローカル変数フレーム
>  * 動的ローカル変数フレーム
>  * self
>  * 現在のclass(定数・メソッドの定義先)
>  * そのほか付加的な値

そうすると, procは既存のバインディングに対して動的ローカル変数を追加し
た新たなバインディングを生成しているともいえますね.

通常のProcは現在のバインディングを引き継ぎますが, 明示的にバインディン
グを指定して, かつ, 動的ローカル変数とその値の設定が無理なくできれば求
めるものができそうな.

  aa = "foo"
  Proc.new(a_binding, :aa)

上記は, あるバインディングa_bindingに 変数aaを動的ローカル変数aaとして
追加しているところです.

__
.........................................石塚 圭樹@今はフリー(^^;;...
------->>また, アドレス変わりました!! e-mail: keiju / bc.mbn.or.jp <<---