例えばこんな感じで使えるとうれしいだろうか?
(import (rnrs) (util concurrent)) (define-pipeline-catalogue pipeline-catalogue-a (* => pipe1) ((sync pipe1) (=> pipe2) (-> epipe1)) ((async pipe2 5) (symbol? pipe3sym) (string? pipe3str) (=> pipe3gen)) (pipe3sym => *) (pipe3str => *) (pipe3gen => pipe3sym) ;; = (async epipe1 1) (epipe1 (=> pipe1) (-> !))) ;; so something (define-pipe (pipe1 input) 'output) ;; do correction (define-pipe (epipe1 error) 'output) (define-pipe (pipe2 input) "string") (define-pipe (pipe3sym input) input) (define-pipe (pipe3str input) (string->symbol input)) (define-pipe (pipe3gen input) 'symbol) (define-pipe (epipe1 e) 'recover) (define pipeline-a (instantiate-pipeline-catalogue pipeline-catalogue-a)) ;; async call (pipeline-send-message! pipeline-a 'message) ;; waits (pipeline-receive-message! pipeline-a)パイプラインカタログはパイプのつながり方を定義し、
define-pipe
は実際のパイプを定義する。(パイプという名前はいまいちだから、define-pipe-unit
にしようかな?) カタログの定義が終わった段階では特に何もせず、インスタンスを作って初めて使用可能にする。まぁ、再利用可能にするため。同期と非同期はちと微妙な感じもする。問題はパイプラインを作るたびにスレッドを10個とか作りそうなところがあることか?ネットワーク通信みたいな重たい処理だけにほしいので、基本同期の方がいいのかな?もう少し寝かせた方がいいかもしれない…