From: keiju@... (=?ISO-2022-JP?B?GyRCQFBETTc9PHkbKEI=?= ) Date: 1998-04-03T18:40:01+09:00 Subject: [ruby-dev:2053] Re: [Req] Binding.new けいじゅ@日本ラショナルソフトウェアです. In [ruby-dev :2039 ] the message: "[ruby-dev:2039] Re: [Req] Binding.new ", on Apr/03 13:51(JST) Yukihiro Matsumoto writes: >まつもと ゆきひろです >|どーしてもというわけでもないんですが, 直接的な要望としては, インタラク >|ティブな言語(elispやsmalltal)では, top levelが複数あるわけですけど, >|rubyでもそれを直接サポートしてくれる機能が欲しいわけです. で, それなら >|Bindingが直接できても良いかと... > >複数のトップレベルはインタラクティブな言語一般の機能ではない >でしょう.すくなくともelispには複数のトップレベルはないよう >に思います. ほんとだ... 確かにelispにはないですね(__;;; # elispって動的スコープだから, scratchでsetqとかすると思わぬ副作用が出 # ちゃうんですね(@@;;; まあ, 汎用言語じゃないからいいのかもしれないけ # ど... >bindingはある時点でのコンテキストとでも呼ぶべきもので確かに >スコープも持っています(他にも色々持っています).が,もともと >の目的も実装も「ある時点での状態(コンテキスト)の切り出し」で >すから,新しいコンテキストの合成というのは新しい概念になるわ >けです. それはそうですね. >ですから,この場合新たに合成できる「なにか」はどのようなもの >であるかを考察して,それをbindingと呼ぶならbindingに新しい定 >義を与える必要があると思うわけです. なるほど. それはいえますね. >bindingがスコープに似ているから,あるいはスコープを持ってい >るからスコープとしての働きを追加するというのは少々乱暴な印象 >があります. えーと, 新たなスコープを作ってしまうということが気になっているんですね? >確かにスコープを生成するのは4パターンだけですが,スコープに >はクラス/モジュール定義のネスト関係も含まれてます.これは無 >視しますか? 指定するのも大変ですし... class Foo class Bar binding.subbinding... とすればとりあえずネストは作れるので良いのかと... そういう意味では, selfも指定できるんでしたっけ? >です.ですから,ruby用語におけるスコープでは石塚さんのニーズ >を満たさないと思います. 欲しいのはevalできる情報ですから, バインディングでないと無理でしょうね. >石塚さんが求めていらっしゃるものは上記の定義のうち,どちらか >といえばバインディングに近いですが,ある時点のものではなく合 >成したコンテキストであるという点が引っかかっています. うーん. それなりの機能を持ったスコープを作る構文orイテレータでも良いん ですけどね... >んで,バインディングを合成する場合,いろいろある状態のうち, >selfとthe_classだけ指定するというのは,なんとなく今回のニー >ズがそうだからという理由であるように思えるのです. > >とはいえ沢山ある状態をいちいち指定して合成するってのもなんか >大変な話だと思いますし,ネスト状態のようにどうやって指定した >もんだか迷うものもあります. そうですねえ... ネストは上記のようにすれば好きなものが作れますよね? 同様に引数として渡 さなくても済むものは全部省くというのでも良いと思います. もし, 全然指定 しなくても良くできるなら, ローカル変数だけが独立な(サブ)バインディング を合成しても良いかなと思います. binding.subbinding -- ところで, いま, 関数を使ってやってみているんですけど, 問題に気づきまし た. dim% irb irb:001:0> def foo irb:002:1> print "1" irb:003:1> end nil irb:004:0> irb # サブirb立ちあげ irb#1:001:0> def bar #<-メソッド中のバインディングで実行 irb#1:002:1> print "2" irb#1:003:1> end nil irb#1:004:0> exit # サブirbの終了 nil irb:006:0> private_methods.sort [... "foo", ...] irb:007:0> methods.sort [... "bar", ...] irb:008:0> とメソッドがpublicになってしまいます. バインディングの取り出しは, 以下 のメソッドをトップレベルで定義しています. def self.irb_local_binding binding end もうひとつ, module ExtendCommand def irb_local_binding instance_eval("binding") end end extend ExtendCommand としてbindingを取り出すようにすると, 今度は特異メソッドとして定義して しまいます. privateとして定義する何かうまい手がありますかね? __ ................................石塚 圭樹@日本ラショナルソフトェア... ----------------------------------->> e-mail: keiju@rational.com <<---