Makoto Satoh
makot****@yahoo*****
2003年 10月 2日 (木) 23:19:47 JST
佐藤です。 # へたれですいません。。。 Shiro Kawai <shiro****@lava*****> wrote: > SchemeからC関数を呼ぶ際の引数・戻り値の受渡し > 方法について言えば、そんなに難しくはないと思うのですが。 > (ドキュメントが無いという問題は別にして) > 何がひっかかっているのか、具体的な例をあげてみてもらえますでしょうか。 えーと、spigotではVectorを用意してCでの計算結果をScheme側へ渡していたり、 pgではstubファイルでクラスを作っていたり、gauche.hを見ると似たような機能の マクロがたくさん定義されているように見えたりと、Cの経験不足から混乱して しまっていました。 > > 私には、例えば、SCM_MAKE_STRとSCM_MAKE_STR_COPYINGの違い > > とか、MySQLのハンドルはどうやって渡したらいいの?とかが > > 分かりませんです。 > > えーっと、これらは、SchemeオブジェクトからCオブジェクトを > 取り出したり(unboxing)、CオブジェクトをSchemeオブジェクトに > ラップしたり(boxing)する方法に関しての話ととってよいでしょうか。 そうです。 > (これは、SchemeからCを呼ぶ場合の引数/値の受渡しという話とは > ちょっと異なる問題です) うっ。SchemeからCを呼ぶとは、つまりJavaのJNIみたいなことでしょうか? Cのライブラリがあるので、それをSchemeプログラムから使いたいのです。 具体的には、MySQLやMing、Sary、PDFlibあたりを考えています。 まあ、MySQLはDBI/DBDのような仕組みにしたいという話もありましたが。 > どんなスクリプティング言語でもそうですが、boxing/unboxingに > おける注意点は、Cポインタを渡す場合のownershipです。 > Gaucheでは、Schemeオブジェクトは全てGaucheが所有します。 > したがって、C側で所有するメモリの内容をGaucheに渡したければ、 > SCM_NEW*等でGaucheのメモリをアロケートしてコピーするか、 > finalizerを登録してGaucheがそのオブジェクトを必要としなく > なった時にownershipを返してもらうかしなければなりません。 なるほど。そういうことも考えなければならないのですね。 やはり経験不足が効いてます。。。 (snip) > 例えば、C側でmallocしたchar配列からScheme文字列を作りたい > 場合は、ownershipはC側にあってSchemeには渡せないので、 > SCM_MAKE_STR_COPYINGを呼び、その後でC側の配列をfreeしなければ > なりません。一方、C関数内で SCM_NEW/SCM_NEW_ATOMIC でアロケート > した文字列は、既にGaucheが所有しているので、SCM_MAKE_STRに > 渡しっぱなしにできます。 このownershipについては、何となく分かるような分からないような 感じですので、もう少し勉強してきます。 (snip) > MySQLのハンドルのように、Schemeにとって異世界である資源の > 場合は、専用のクラスを作成してハンドルを包み込んでやるか、 > C側でテーブルを作って管理してやる必要があります。 > (後者はTclで使われています)。 > この場合、Schemeはオブジェクトの実体について何も知らないので、 > finalizerを登録してC側で後始末をつけてやるようにします。 MySQLについては、DBI/DBDライクな仕組みがやはり良いのでしょうが、 とりあえず自分ローカルでも使えないかなと思いましたが、ハードルが 高かったです。 英語MLでの拡張の話のときもTclの話が出てましたが、Tclは参考に なる部分が多いですか? -- Makoto Satoh