このディレクトリには MIT-Scheme 7.5.12, Guile 1.4, および STk 4.0.1 から WAM を使うためのサンプルコードが納められている. はじめに wflid というプログラムが WAM 側のサーバであり, このサーバとscheme 側 のクライアントがソケットで通信することでインタフェースを取っている. ソ ケットの種類としては, MIT-Scheme, STk は TCP ソケット, Guile は local ソケットを用いている. テストの方法 1. サーバを起動 $ ./wflid -inet & ./wflid -local & 2.1 guile の場合 $ guile -s testg.scm 2.2 STk の場合 $ stk tests.scm start ボタンを押す 2.3 MIT-Scheme の場合 $ scheme 1 ]=> (load "testm") 3. 結果の確認 いずれも, 6番目の要素(i.e. (list-ref list 5))以外が #t のリストを書 き出すこと確認する. (結果は unspecified) 注意1 MIT-Scheme, guile 共に EUC で使用することを想定しており, WAM が JIS (ISO-2022-JP2) で作成されていると不都合が生じる. その場合, Makefile で JIS_WAM を指定すれば, swam.c sexp.c が適切な変換を行う. 注意2 このインタフェースモジュールは socket を使っているので遅い(と思う). Perl5 の XS などの様に C のライブラリと直接インタフェースを取る方法が 提供されている言語では, それを使うと劇的に速くなるかもしれないし, そ うではなく, 律速はインタフェース部ではないのかもしれない. この他の lisp 系言語とのインタフェースの取り方 1. wflid は socket (local, inet) で通信できる. このいずれかで wflid に接続し, それを通して print/read できるようにする. wfild を修正して stdin/stdout が使える様にすることも容易なので pipe/fork/exec でも接続できるかもしれない. 2. scheme 以外の場合でベクタが使えない場合, scheme 版でベクタになってい るところはすべてリストにする. すると, wfild 側の read に相当するルーチ ンはベクタとリストを区別しないので, ここは修正不要. wfild の print に 相当するルーチンは無く, C の printf, fputs, putchar で構成されているの で, ここで #( と書いている所を ( と書く様に修正する. その他の言語とのインタフェースの取り方 S-expression 以外の表現が必要だとしても, wfild の出力はそれに合わせ て比較的容易に修正が可能であると思われる. 問題は入力だが, S-expression を容易に生成できる言語ならそれを用いれば 良い. Haskell や ML の様にリストが [ , ] で書かれている言語の場合, wfild がそれをパーズできる様にするのは腕に覚えのある C プログラマなら 半日仕事かもしれない. もっとも, 関数型言語とのインタフェースはもっと 抽象化したレベルで再設計した方が良いと思われる.