Pipe バックエンドのマクロ
シェルでサポートする Pipe のバックエンドとなるマクロを書いた。
(define-syntax pipe (lambda (x) (syntax-case x () [(_ (cmd1 args1) (cmd2 args2) ...) #'(let-values ([(in1 out1) (%pipe)]) (%spawn cmd1 args1 (list #f out1 #f)) (close-port out1) (pipe "internal" in1 (cmd2 args2) ...) (do ([i 0 (+ i 1)]) ((= i (length '((cmd2 args2) ...)))) (%waitpid -1)))] [(_ "internal" in (cmd args)) #'(begin (%spawn cmd args (list in #f #f)) (close-port in))] [(_ "internal" in (cmd1 args1) (cmd2 args2) (cmd3 args3) ...) #'(let-values ([(in1 out1) (%pipe)]) (%spawn cmd1 args1 (list in out1 #f)) (close-port out1) (pipe "internal" in1 (cmd2 args2) (cmd3 args3) ...))] ))) ;; 使い方 (pipe ("ls" '()) ("grep" '("Pro")) ("grep" '("cpp")) ("grep" '("VM")))