文字列ポートをパイプっぽく繋ぎたい

ずいぶん昔に Scheme で書いたコードを発掘した。 協調スレッドの一種だが、値を生産する側と消費する側という形で抽象化されている。

(define (distribute productor consumer)
  (define next-c #f)
  (define (next-p)
    (productor
     (lambda x
       (call/cc
         (lambda(cc)
           (set! next-p cc)
           (apply next-c x))))))
  (consumer
   (lambda()
     (call/cc
       (lambda(cc)
         (set! next-c cc)
         (next-p))))))

(distribute
 (lambda(out)
   (out 1) (out 2) (out 3) (out #f))
 (lambda(in)
   (while (in) => a (display a))))

これを書いたときに何を考えていたのか思い出すと、出力文字列ポートと入力文字列ポートで同じようなことを出来ないかということだった。

それと言うのも、Gauche の http-get には結果をポートに出力する機能があり gd-image-read はポートから読出すというのに、一旦は全体を文字列として生成しなければならないというのがどうにも無駄に感じたというところからの着想である。

ポートから読出してポートに出力する手続きをただ繋げればよいような仕組があれば巨大なバイナリを楽に扱えるのではないか、そんな風に思ったもののバッファの管理が思ったよりも面倒な感じだったのでやめたのだった。

いずれ気が向いたら再びやってみようと思うので、ここにメモとして残すことにした次第。

Document ID: a7778a3d8881307ab0d7a36703b908a6