cielacanth

cielacanth

自己紹介

C/C++/Lispをこよなく愛するプログラマ。ドキュメンタリーも好きです。

書いたもの

面白かったドキュメンタリー

過去の作品


gaucheの疑問など

(別ページからの転載)

 (define-cclass <point> "Point*" "Scm_PointClass"
     () ())
 
 ; (A)
 (define-cmethod x-of ((pos "Scm_PointClass"))
     "...")
 
 : (B)
 (define-cmethod y-of (pos::<point>)
     "...")

スタブファイル中でこのようにすると、

という事態になってしまいます。 これを正しく行うにはいったいどのようにすればいいのでしょうか? よろしくお願いします。

Shiro(2008/04/28 05:24:21 PDT): define-cclassとdefine-cmethodの仕様はhalf-bakedなので 「正しいやりかた」というのがまだ無いと言った方がいいでしょう。 define-cclassで定義される「C界でのクラス名」と「Scheme界でのクラス名」 との結びつきをどうやって管理するか(特に、複数ファイルにまたがる場合)という 肝心なところを決めてないため、とても中途半端な仕様になっています。

それと、define-cmethodを使った場合、generic functionがCレベルで 定義されている必要があったような。たぶん、ほかのモジュールでx-ofという メソッドがSchemeレベルで定義されてて、それをuseしているモジュールで 上のようなstub定義があった場合にうまくいかないんじゃないかと思います。

今のところ、ちょっと不便ですが、stubでは

  (define-cproc %point-x (pos::<point>) ...)

として、Schemeファイルの方で

  (define-method x-of ((pos::<point>)) (%point-x pos))

としてもらうのが確実だと思います。

なお、Common Lispでは多用するアクセサメソッドですが、 GaucheではGauche:GenericFunctionとModuleのような問題もあるので、 最近はあまり推奨していません。原則、refを使うのが良いでしょう。

More ...