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送ってるのになぁ