Gauche対応への道
yuniFFIはyuniライブラリの一部なので移植性が要求される(API記述から生成したbindingを各種scheme処理系で使い回す)。
一つのscheme処理系に移植するにあたって、トピックはいくつか有る:
- C bridge: DLLロード/呼び出し
- C object system: 構造体アクセス
C object systemは殆どがSchemeで書ける。大抵の処理系にはSRFI-9が有るので、それをバックエンドにしつつ幾つかのsyntactic sugarを実装していくことになる。ここでの問題は低レベルマクロに処理系間の互換性が無い点で、syntax-rulesで全部頑張るか、symbolのconcat程度は諦めて移植層として提供するかを考えないといけない。
C bridgeは、dynamic bindingなFFIを持つ処理系(nmoshやsagittariusのようなR6RS語族に多い)はSchemeで書ける。しかし、標準でdynamic bindingの無い処理系(Gaucheやchibi-schemeのようなR7RS語族に多い)はC言語で書かれたglueを同時に用意する必要が有る。
Gaucheの拡張DLLの作り方を調べる
Gaucheの拡張ライブラリはexamples/mqueue-cppにサンプルが有る:
とりあえずDLLをビルドするだけなら、gauche-packageコマンドで全てを行える。Windows版のGaucheはMinGW32でビルドされているので、TDM-GCC( http://tdm-gcc.tdragon.net/ )を使用してDLLを作る。
- TDM-GCCをインストールした場所にchdirする
- mingwvars.batを起動し、PATHにgccを追加する
- 適当なディレクトリを掘り、chdirする
- gauche-package generate yuni_check
- cd yuni_check
- gauche-package compile yuni_check yuni_check.c yuni_checklib.stub
- gosh -A. test.scm
モジュール名にハイフンやピリオドのような変換対象の名称を含めるとうまくいかない。
C:\tdm-gcc-32>mingwvars.bat Setting up environment for using MinGW with GCC from C:\tdm-gcc-32\. C:\tdm-gcc-32>gcc --version gcc (tdm-2) 4.8.1 Copyright (C) 2013 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. C:\build\check\check>gauche-package generate yuni_check C:\build\check\check>cd yuni_check C:\build\check\check\yuni_check>gauche-package compile yuni_check yuni_check.c yuni_checklib.stub C:\build\check\check\yuni_check>gosh -A. test.scm Testing yuni_check ... testing bindings in #<module yuni_check> ... ok test test-yuni_check, expects "yuni_check is working" ==> ok passed.