From: kai13@... Date: 2001-03-02T16:03:35+09:00 Subject: [ruby-list:28414] Re: 【要望】 EmacsLisp みたいなフック On Fri, 2 Mar 2001 03:12:28 +0900 gotoken@math.sci.hokudai.ac.jp (GOTO Kentaro) wrote: > ごとけんです > > In message "[ruby-list:28380] Re: 【要望】 EmacsLisp みたいなフック" > on 01/02/28, kai13@basil.freemail.ne.jp writes: > >実装について、フックと表現しましたが、 > >EmacsLispではhookを利用しても、モードなどの作成に挫折したクチですので > >あまり厳密にとらえないでください(^^;。 > > 厳密というか、それをフックと呼ぶのは誤解の素と思いました。 > = On Fri, 2 Mar 2001 09:26:52 +0900 = Nakamura Akifumi wrote: >[Tiki:新しいGUI〜OOPとの対比]に俺こと戯が書いた妄言(笑)の、 >>『単一のgeneric loopの中から任意複数のyieldが呼ばれる』 >>ことを以って『イベント駆動』と呼べば良いのか >という奴と同じ意味でしょうか? 確かにイベント駆動というほうがすっきりします。 = On Fri, 2 Mar 2001 06:37:12 +0900 = Shin-ichiro HARA wrote: >> class Visitor >> def initialize >> yield(self) >> end 確かにこの辺りでぞくぞくします。 > (どこかで聞いたような話ですが)複数のブロックを渡したい場合の > 例として、2分木を深さ優先で「なぞる」(traverseする)ときがあ > ります。木をなぞりながらブロックを実行させるには、次の3つの > タイミングがあります: > > * あるノードに到達したとき > * そのノードの左の枝の処理が終わったとき > * そのノードの両方の枝の処理が終わったとき > > これらを次のように指定できるようにすることが可能です。 > > BinTree.traverse do |v| > v.before do |node| ... end # 達した > v.middle do |node| ... end # 左が終わった > v.after do |node| ... end # 両方終わった > end > > これは traverse が2段階の動作をすることで実現されます。 > > (1) 指定される「なぞり屋」 v をつくる。その動作の指定は > ブロックで与える > (2) v になぞらせる > > ポイントは、ブロックパメータが要素をあらわす必要はないという > ことです。この場合は v がそうです。 > この「なぞり屋」をクラス作成者が用意して、 ユーザーからこの部分からデータのリストを欲しいという時に 「なぞり屋」に新しい状態を定義して渡すだけなのでクラスの汎用化が楽になりますね。 加えて、ユーザーから「なぞり屋」の呼び出し順序は、 クラス作成者が管理できるというところも魅力的です。 > # 参考までに、一つの実装例を示します。木の表示です: > > class BinTree > ..... ちょうど Tree の勉強をしていたところなので非常に勉強になりました。 試しに、実際クラスををイベント駆動にして作成してみました。 (現在実証実験中のαバージョンなので、ちゃんと使えて動いていますという意味であって、正式公開ではありません。サイト閉鎖のため配布期間は長くても3日) http://tat6.ice.ous.ac.jp/akita/filez/cache_save2.rb このプログラムは、インターネット上からファイルをダウンロードするものです。 イベント駆動部分はファイルリストを与える部分と、ファイルが更新されている リストを与える部分に用いています。 -- 秋田