言語ゲーム

とあるエンジニアが嘘ばかり書く日記

Twitter: @propella

互換性のある Scheme を書きたい。

最近 PLT-Scheme を使うようになったが、PLT-Scheme で書いたプログラムを他の Scheme で動かすのって意外と難しい事が分かった。なんだこのバラバラさは。色々な Scheme で動くプログラムを書くにはどうすればいいのだろうか。調べて行くと、slib http://people.csail.mit.edu/jaffer/SLIB.html というライブラリに辿り着いた。slib というのは、Scheme 用に便利関数を集めたライブラリで、沢山の Scheme に対応している。これの真似をすれば色んな Scheme で動くプログラムが作れるんじゃないだろうか。

気づかないうちに自分のマシンに slib が入っていた。どうも gauche を port で入れた時に入ったようだ。man slib を読むと、slib という名前のコマンドが提供されていて、引き数に実装の名前を入れると slib 付きの scheme が起動する。例えば slib guile とすると slib 付きの guile が起動する。実はこれだけではまだ使えなくて、guile の中でさらに (use-modules (ice-9 slib)) が必要だ。

$ slib guile
guile> (use-modules (ice-9 slib))
guile> (slib:report-version)
SLIB "3b1" on guile "1.8.4" on unix 

gauche の場合、slib gauche というのは用意されていないが、gauche 側でサポートされているので gosh の中で (use slib) とやると使える。

$ gosh
gosh> (use slib)
#<undef>
gosh> (slib:report-version)
SLIB "3b1" on gauche "0.8.13" on unix 
#<undef>

ではどうやって互換性を実現しているのか見てみる。slib コマンドの場合、中で guile.info という初期化ファイルを読み込んでいる。このディレクトリ (MacPort では /opt/local/lib/slib) になんとか.info が沢山あり、処理系ごとの互換性レイヤになっている。gosh の場合は .info の代わりに gauche ライブラリの slib.scm というファイルが slib の初期化に使われる。そして初期化ファイルの中で require がロードされて slib が利用可能になる。

さて、肝心な PLT-Scheme だが、slib は PLT-Scheme に対応していないとホームページに書いてあった。ガックリ。まあ結論としては

  • 処理系ごとに初期化ファイル(互換性レイヤ)を用意する。
  • 処理系ごとの初期化ファイルと scheme 実行ファイルを読み込むスクリプトを作成

という当たり前の話になった。