[Gauche-devel-jp] Re: define-cclassについて

アーカイブの一覧に戻る

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









Gauche-devel-jp メーリングリストの案内
アーカイブの一覧に戻る