例えばこんな感じで使えるとうれしいだろうか?
(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個とか作りそうなところがあることか?ネットワーク通信みたいな重たい処理だけにほしいので、基本同期の方がいいのかな?もう少し寝かせた方がいいかもしれない…
No comments:
Post a Comment