Gauche > Archives > 2012/07/25

2012/07/25 06:53:14 UTCyamasushi
#
スレッドをつかってcall-withアクセスするものを作ってみたのですが、どうもSSAXがうまく動かないです。make-consumerでキューからジェネレータを作るところか、仮想ポート生成部かがおかしいのだろうと思っています。https://gist.github.com/3174805/abd5b724bbf9c1bb8cd39b4edae72adb22e8b761
#
スレッドの扱いもまずいのかもしれません。(汗
#
httpでマルチバイトのデータを受け取り、キュー経由でジェネレータにして、それを使って仮想ポートを作り、手続きに渡すという設計なのですが、この設計がまずいのでしょうか・・・・orz
2012/07/25 11:29:50 UTCyamasushi
#
単にキューからとってきた不完全文字列をジェネレータにして、仮想ポートのgetcにキャラクタジェネレータをわたすなら、マルチバイト文字がないデータ限定でうまくいくのです。問題はproducerがマルチバイトのデータをキューにいれたとき、これではうまくいかない。
#
仮想ポートのgetcを設定する場合: https://gist.github.com/3174805/5778ac65bbbd30ae757edd63b1e07bf2f0119847
2012/07/25 17:09:23 UTCshiro
#
マルチバイトデータが途中で切れてる場合ですね。この場合、新たなデータが来るまでgetcを待たせなければなりませんが、今のやり方だとそれがうまく書けないと思います。<virtual-buffered-port>を使えばそのへんの処理を全部port側でやってくれるはずですが、試してみました?
2012/07/25 21:35:39 UTCyamasushi
#
<virtual-buffered-port>を試してみます。ありがとうございます。
2012/07/25 23:22:26 UTCyamasushi
#
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のほうが扱いやすいですね・・・
2012/07/25 23:24:58 UTCshiro
#
receiverは一番低レベルのAPIで、その上に色々な便利receiver (http-file-receiverとかhttp-cond-receiverとか) が作られることを想定しています。
2012/07/25 23:30:42 UTCyamasushi
#
なるほど。