Gauche対応への道

yuniFFIはyuniライブラリの一部なので移植性が要求される(API記述から生成したbindingを各種scheme処理系で使い回す)。
一つのscheme処理系に移植するにあたって、トピックはいくつか有る:

  1. C bridge: DLLロード/呼び出し
    1. DLLからシンボルを解決する
    2. generic calling conventionな関数を呼び出す(Scheme→C呼び出し)
    3. generic calling conventionな関数callbackを生成する(C→Scheme呼び出し)
  2. C object system: 構造体アクセス
    1. シンボルからの値構築
    2. 構造体 / API呼び出しパラメタのpretty-print
    3. 構造体 / API呼び出しのパラメタ補完

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を作る。

  1. TDM-GCCをインストールした場所にchdirする
  2. mingwvars.batを起動し、PATHにgccを追加する
  3. 適当なディレクトリを掘り、chdirする
  4. gauche-package generate yuni_check
  5. cd yuni_check
  6. gauche-package compile yuni_check yuni_check.c yuni_checklib.stub
  7. 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.