(define (interact p) (let ((child (car p)) (in (cadr p)) (out (caddr p))) (run (stty raw -echo)) (& (begin (exec-epf (cat) (= 1 ,out)))) (exec-epf (cat) (= 0 ,in)))) (define-syntax bg (syntax-rules () ((_ cmd) (call-with-values (lambda () (fork-pty-session (lambda () (exec-epf cmd)))) list)))) (define-syntax expect (syntax-rules () ((_ cmd proc) (let* ((p (bg cmd)) (in (cadr p))) (let l ((b "")) (l (string-append (proc p b) (string (read-char in))))))))) (define (handled m b r) (let ((e (+ m (string-length r)))) (display (substring b 0 e)) (substring b e (string-length b)))) (define-syntax expect-cond (syntax-rules (=>) ((_ b (r => a ...) c ...) (let ((m (string-contains b r))) (if m (begin a ... (handled m b r)) (expect-cond b c ...)))) ((_ b) b))) (expect (.. cmd ..) (lambda (p b) (let ((po (caddr p))) (expect-cond b ("assword: " => (display "pwpw\n" po))))))