#スレッドをつかってcall-withアクセスするものを作ってみたのですが、どうもSSAXがうまく動かないです。make-consumerでキューからジェネレータを作るところか、仮想ポート生成部かがおかしいのだろうと思っています。https://gist.github.com/3174805/abd5b724bbf9c1bb8cd39b4edae72adb22e8b761 #スレッドの扱いもまずいのかもしれません。(汗
#httpでマルチバイトのデータを受け取り、キュー経由でジェネレータにして、それを使って仮想ポートを作り、手続きに渡すという設計なのですが、この設計がまずいのでしょうか・・・・orz
#単にキューからとってきた不完全文字列をジェネレータにして、仮想ポートのgetcにキャラクタジェネレータをわたすなら、マルチバイト文字がないデータ限定でうまくいくのです。問題はproducerがマルチバイトのデータをキューにいれたとき、これではうまくいかない。
##マルチバイトデータが途中で切れてる場合ですね。この場合、新たなデータが来るまでgetcを待たせなければなりませんが、今のやり方だとそれがうまく書けないと思います。<virtual-buffered-port>を使えばそのへんの処理を全部port側でやってくれるはずですが、試してみました?
#<virtual-buffered-port>を試してみます。ありがとうございます。
#call-with-input-httpを http-get(sink & flusher API) ---> buffered-output-port --> queue --> buffered-input-port ---> goal! のように実装しました。 https://gist.github.com/3179295/3d0def581b61834405aa22f74fdae58d95324aa1 #portのバッファ処理を考えると、receiverよりsink&flusherのほうが扱いやすいですね・・・
#receiverは一番低レベルのAPIで、その上に色々な便利receiver (http-file-receiverとかhttp-cond-receiverとか) が作られることを想定しています。
#なるほど。