(define-module (control monad) #:use-module (control monad procedures) ;; #:use-module (control monad syntax) #:export (do <-) ;; #:re-export (>>= do <-) ) (define-syntax do (syntax-rules (<- let =) ((_ let var = val rest ...) (let ((var val)) (do rest ...))) ((_ ptrn <- val rest ...) (<- ptrn val rest ...)) ((_ a) a) ((_ token rest ...) (begin token (do rest ...))))) (define-syntax <- (syntax-rules (just writer) ((_ (just var) val rest ...) (>>= val (lambda (var) rest ...))) ((_ (writer var) val rest ...) (>>= val (lambda (var) rest ...)))) #; (lambda (x) (syntax-case x (just writer) ((_ (just var) val rest ...) #'(>>= val (lambda (var) rest ...))) ((_ (writer var) val rest ...) #'(>>= val (lambda (var) rest ...))) #; ((_ (left var) val rest ...) ; #'(>>= val (lambda (var) rest ...))) #; ((_ (right var) val rest ...) ; #'(>>= val (lambda (var) rest ...))))))