Shiro Kawai
shiro****@lava*****
2004年 1月 24日 (土) 13:24:53 JST
define-cclassは暫定仕様でして、まだ本当にどうするべきかを 決めていません。模索中です。 Cで定義した構造体をSchemeに見せるコードは、原則としてC側で書くしか ないです。ただ、そこでいくつかイディオムがあるので、define-cclassは そういったイディオムを自動生成できなかという試みの最中だと 思ってください。 Cの構造体をSchemeに見せる方法としては、ext/fcntlにおける<sys-flock>の 実装や、ext/termiosにおける<sys-termios>の実装を参考にしてください。 いずれもdefine-cclassは使わず、C側だけで処理しています。 おおまかな流れは、.cファイルで * クラスインスタンスの定義: SCM_DEFINE_BUILTIN_CLASS (Schemeで継承を許さない場合) * 必要なクラスメソッドの定義: 無くてもよい。無ければデフォルトが使われる。 print : 表示ルーチン allocate : Scheme側から (make クラス ...) でインスタンスを作成 させたい場合は定義する。makeでインスタンスを作らない場合は NULLでよい。 compare : equal? で比較したい場合は定義する。NULLにしとくとeq?比較 が使われる。 * 必要なスロットアクセサの定義: Cで定義した構造体のフィールドをScheme 側でスロットとして見せたい場合は、書くフィールドのgetter, setterを 書く。describeで値が見れたりする利点があるが、そのぶん面倒。 スロットとして見せずに、アクセサ関数を別に提供する方法もあるので、 お好きな方を。 スロットアクセサを使うなら、ScmClassStaticSlotSpecの配列を 定義しておく必要もある。 * 拡張モジュールの初期化ルーチンにて、Scm_InitBuiltinClassを呼ぶ。 ここで<mysql-handle>等のシンボルのinternが行われる。 という流れです。 ところで $ gosh -I. gosh> (dynamic-load "mysql") #t gosh> (d <mysql-handle>) *** ERROR: unbound variable: <mysql-handle> Stack Trace: _______________________________________ gosh> (d <mysql-res>) *** ERROR: unbound variable: <mysql-res> Stack Trace: _______________________________________ これは、<mysql-handle>等が定義されてるモジュールをimportしてないだけ、 もしくはそのモジュールから<mysql-handle>がexportされていないだけ、 とかいう可能性はありますか? --shiro