From: keiju@... (=?ISO-2022-JP?B?GyRCQFBETTc9PHkbKEI=?= ) Date: 1997-06-14T09:24:17+09:00 Subject: [ruby-list:3125] Re: [Q] singleton method for module けいじゅ@今はフリー(^^;;;です. In [ruby-list :03124 ] the message: "[ruby-list:3124] Re: [Q] singleton method for module ", on Jun/14 02:14(+0200) matz@caelum.co.jp (Yukihiro Matsumoto) writes: >もうそろそろ眠くて良く分かんなかったんだけど,なんか解決した >みたいですね(良かった,良かった). 自己完結してしまった見たいですいません(__;;; >しかし,なんかむずかしい話をしているなという気がします.ここ >までやるんなら,なんでもありのCコードを書いちゃうってのが良 >いような気がして来ました. rubyの限界に挑戦しているのでしょう(^^;;; # それにこのぐらいのことでCで書くのもねえ... という気がしています. rubyは, 普通のプログラミングは便利なのですが, meta-levelのプログラミン グ(今回はライブラリ(class or module)のためのライブラリ(module))を行お うとすると, 途端に複雑かつ困難になりますね. そういえば, このプログラムの面白いところが一つあって, module Exception2MessageMapper ... Exception2MessageMapper.extend_to(self) def_exception("ErrNotClassOrModule", "Not Class or Module") end となっているところです. つまり, 自分自身(Exception2MessageMapper)を自 分自身にextendしています. うまく動作するかなと思いましたが, ちゃんと動 作しているみたいです. rubyは偉い!! (^^;;; ところで, 例外が発生した時のバックトレースを操作することができるような 話しを伺いましたがどうしたらいいんでしたっけ? 以下のメソッドの def fail... の中の superのところで, この関数(fail)を 呼び出しているという情報を削除して super したいのですが... def bind(b) # E2MM_ErrorMSG: Exception -> Message(printf form) @binding = b # fail(err, *rest) # err: 例外 # rest: メッセージに渡すパラメータ # eval "E2MM_ErrorMSG = Hash.new def fail!(*rest) super end def fail(err, *rest) # $@ = caller(1) super(err, sprintf(E2MM_ErrorMSG[err], *rest)) end public :fail ", @binding end # 現在, bindingを使わなくてもすむ実装があることに気づきましたので変更 # しています. __ .........................................石塚 圭樹@今はフリー(^^;;... ------->>また, アドレス変わりました!! e-mail: keiju@bc.mbn.or.jp <<---