Gauche > Archives > 2011/02/10

2011/02/10 16:31:37 UTC齊藤
#
open-output-string で開いたポートを wrap-with-output-conversion に通して http-get の :sink に与えるとエラーになるみたいです。
#
↓こんなの
 *** ERROR: output string port required, but got #<oport [conv(euc-jp->utf-8) to "(output string port)"] 01e9d310>
2011/02/10 17:38:05 UTCshiro
#
:flusherを与えていないからだったりしませんか? 現在ドキュメントされている仕様では、flusherのデフォルトは (lambda (sink headers) (get-output-string sink)) なので sinkにstring port以外を与えるとそのエラーになると思います。
2011/02/10 17:50:30 UTC齊藤
#
(^ _ #f) にしたんですが…
#
wrap-with-output-conversion を通すと get-output-string できないんですね。
2011/02/10 17:52:17 UTCshiro
#
おやん。じゃあどこがget-output-string呼んでるんだろう。
2011/02/10 17:53:50 UTC齊藤
#
念のため自分が書いたものを見直してみます。
2011/02/10 17:54:19 UTCshiro
#
手元では :flusher を与えたらエラーにはならなかったです。
2011/02/10 17:54:22 UTC齊藤
#
と、思ったけど諦めてポートを通さない形に書き換えてた…。
#
一応記憶を頼りにもう一度書いてみよう。
2011/02/10 17:55:31 UTCshiro
#
sinkにはwrapしたものを渡し、flusherの方でwrapしない元のポートに対してget-output-stringを呼べば良いと思います。
2011/02/10 18:05:01 UTC齊藤
#
うわぁぁぁ。 :flusher のつもりが :flush と typo してたみたい。 λ...
#
http-get はキーワード引数とリクエストヘッダを混在する記法なのでこういうとき捕捉されないんですね。
2011/02/10 18:10:29 UTCshiro
#
確かに、捕捉されないのは問題をややこしくするかも。リクエストヘッダとして解釈できるキーワード引数に文字列以外のものが渡って来たらエラーにする、とかで改善できるかな?
2011/02/10 18:15:41 UTC齊藤
#
ところで話は変わりますが、 output string port に蓄積したものを今度は input string port として読み出したいってケースは珍しくないと思うんですが、 get-output-string で取り出して open-input-string するしか無いですか? なんとなく非効率な気がするんですが、内部的には共有されてたりするのかな。
2011/02/10 18:53:36 UTCshiro
#
ああ、get-output-stringはコピーが発生しちゃいますね。output string portは最終的な長さがわからないのでチャンクのリストの形でデータを保持してるので。今のところその蓄積されたデータを得る方法はget-output-stringだけです。
#
procedural buffered portを使ったらパイプのような対のポートを作れるんじゃないかな。
2011/02/10 19:15:24 UTC齊藤
#
<buffered-output-port> を使えば案外簡単に出来そうな予感。