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