ポートをパイプっぽく繋いだ

Scheme でパイプのように使えるポートが欲しいという話を先日は書いた。

http://saito.hatenablog.jp/entry/2014/02/16/000958

そして実際に R6RS 用に書いてみたのがこれだ。

https://github.com/SaitoAtsushi/R6RS-port-pipe

現時点の実装では一回の書込みをひとつのチャンクとしてキューに詰め込んでいく構造になっているので、小さな書込みが多い状況ではあまり性能が出ない。 本格的に使うならチューニングが必要だと思う。 処理系によっては処理系 (が提供しているライブラリ) の側でもバッファリングしているようなので、それの都合に合わせた調整も必要かもしれない。

それと、処理系によって想定通りに動作したりしなかったりに分かれた。

想定通りに動いたのは、

  • Petite Chez Scheme Version 8.4
  • Ypsilon 0.9.6-trunk/r503
  • Larceny v0.97

のみっつ。

mosh 0.2.7 はクラッシュ、 Sagittarius 0.5.1 は無限ループ、 Racket 5.93 はエラーメッセージを出して停止という挙動となった。 Racket が出したエラーはこういうものだ。

continuation application: attempt to cross a continuation barrier

先程このことをツイッタで述べたところ、どこかで C の実装を狭んでしまって継続が途切れているのではないかという意見を貰った。 しかし、簡単なコードで試してみたところ、コールバック手続きの中で継続を補足したり呼んだりしただけでは制限に引っ掛からないようで、具体的に何が問題なのか特定は出来ていない。

[追記] Sagittarius は Racket 同様にエラーを出して止まるように改良されました。 [/追記]

Document ID: e8acff0c80878817f413700d6cbd1f76