close-portを使わずに Gaucheでコマンドの実行時に文字列を標準入力として与え、その結果を得たい(失敗)
昨日のつづきをやってたんだがgaucheでclose-port無しにパイプをうまくコントロールすることが出来ない。
>>((lambda (cmd str) (call-with-process-io cmd (lambda (in out) (copy-port (open-input-string str) out)(close-output-port out)(port->string in)))) "nkf -wmB" "GyRCJDMkcyRLJEEkb0AkMyYbKEIK") =>こんにちわ世界
この状況では動くのだが
>>((lambda (cmd str) (call-with-process-io cmd (lambda (in out) (copy-port (open-input-string str) out)(port->string in)))) "nkf -wmB" "GyRCJDMkcyRLJEEkb0AkMyYbKEIK")
だとだめだ。
Function: open-input-string string
[SRFI-6] stringを内容とする入力文字列ポートを作って返します。 文字列に逐次的にアクセスする場合、インデックスをインクリメントしながら string-refを呼び出すより効率の良い方法です。
(define p (open-input-string "文字 列"))
(read p) ⇒ 文字
(read-char p) ⇒ #\space
(read-char p) ⇒ #\列
(read-char p) ⇒ #<eof>
(read-char p) ⇒ #<eof>
うーん。open-input-stringではEOFを生み出しているのだが…一方copy-portは…
Function: copy-port src dst &keyword (unit 0)
srcからEOFまでデータを読みだし、dstへ書き出します。
キーワード引数unitは0以上の整数か、シンボルbyteもしくはchar でなければなりません。これはデータをコピーする単位を指定します。 整数ならば、その大きさ(0の場合はシステム規定の大きさ)のバッファが確保され、 ブロックI/Oを使って転送が行われます。通常のファイルをコピーする場合などはこれが 速いでしょう。もしunitがシンボルbyteであれば、バイト毎 に読みだし/書き込みが行われます。unitがシンボルcharであれば、 キャラクタ毎に読みだし/書き込みが行われます。
あれー?EOF送ってるのになぁ