(define-module (control monad) #:use-module (control monad procedures) #:use-module (ice-9 match) #:export (do) #:re-export (>> >>=)) (define-syntax do (syntax-rules (<- let =) ((_ let ptrn = val rest ...) (match val (ptrn (do rest ...)))) ((_ ptrn <- val rest ...) (>>= val (match-lambda (ptrn (do rest ...))))) ((_ a) a) ((_ token rest ...) (>> token (do rest ...)))))