Makoto Satoh
makot****@yahoo*****
2005年 4月 18日 (月) 10:43:40 JST
佐藤です。 ありがとうございます。(レスポンスの早さにびっくりしています) --- Shiro Kawai <shiro****@lava*****> からのメッセージ: > > 例えばRubyのObject.method_missing(name, args, ...)や > > Pythonのobject.__getattribute__(name)のような、定義されていない > > 関数が呼び出されたときに呼ばれるフックのようなものは > > 定義できますか? > > スロットならslot-missingメソッドがありますが、Gaucheでは > メソッドはクラスに所属していないため、クラス側でそのような仕組みを > 持つわけにはいきません。メソッドの名前は普通の名前空間で検索 > されるので、どういうトリックを使うにしても、その名前を何かに束縛しておく > 必要があります。 あー、メソッドがクラスに属していないというのを忘れてました。。。 > ただ、gdのAPIがそうさいさい変更されるものでなければ、Cヘッダを > さくっと加工して次のような定義を作っておいて、万能関数 > gd-image-handleの中身だけ真面目に書く、ということは可能でしょう。 > > (define-method gd-image-foo ((im <gd-image>) . args) > (gd-image-handle 'foo im args)) > (define-method gd-image-bar ((im <gd-image>) . args) > (gd-image-handle 'bar im args)) > (define-method gd-image-baz ((im <gd-image>) . args) > (gd-image-handle 'baz im args)) なるほど。しかし、gdのAPIはかなり変更が多そうです。 最近のバージョンアップでは、既存のPNGファイルからイメージデータを 作るなんて関数が追加されたりしていて、上のようにまとめておいても おいしさが少ないかもしれないです。。。 > 私はEmacsでキーボードマクロや使い捨てスクリプトでこういう > 一度きりの一括変換は良くやります。何度もやるような場合は > もう少し真面目にスクリプトを書きます (Gauche-gtkのh2stub.scmとか) なるほど。私もテキスト処理などではそういうことをやるのに、 バインディングを書くなんて初めてで緊張しているのか、 柔軟にいろいろ組み合わせて考える能力が不足している感じですねえ。 > > Cの関数とSchemeの関数名を自動的に変換して、引数にはintのリストを > > 取れるようにすると、ほとんどのバインディングがこれで対応 > > できるのではないかと考えました。 > > ただ、そこまで定型的なのだったら、Cヘッダから使い捨てフィルタと > EmacsでC stubをざくっと作ってしまうのはそんなに難しくなさそうに > 思います。 > > (define-cproc gd-image-foo (im::<gd-image> x::<int> y::<int>) > (return <void> "gdImageFoo")) > (define-cproc gd-image-bar (im::<gd-image> x::<int>) > (return <int> "gdImageBar")) なるほど。Drawing系の関数は結構まとめられそうです。しかし、意外と それ以外の関数も多かったです。。。 > もう少し具体的にこういう例をこうしたいというのがあれば挙げて下さい。 やはりこうやってまとめるのはDrawing系の関数と、gdではPNG/JPEGファイルとの やりとりがありますがその両者をまとめることができるかなという感じです。 例えばDrawing系だと、 void gdImageSetPixel(gdImagePtr im, int x, int y, int color) void gdImageLine(gdImagePtr im, int x1, int y1, int x2, int y2, int color) void gdImageDashedLine(gdImagePtr im, int x1, int y1, int x2, int y2, int color) void gdImagePolygon(gdImagePtr im, gdPointPtr points, int pointsTotal, int color) void gdImageOpenPolygon(gdImagePtr im, gdPointPtr points, int pointsTotal, int color) という感じです。でもこれを見た感じではgd-image-handleがかなり煩雑に なりそうですね。一対一でマッピングしていって、まとめたほうがすっきり するかどうかをもう一度考えます。 ありがとうございました。