diff options
Diffstat (limited to 'control/monad.scm')
-rw-r--r-- | control/monad.scm | 39 |
1 files changed, 39 insertions, 0 deletions
diff --git a/control/monad.scm b/control/monad.scm new file mode 100644 index 0000000..e5dc89d --- /dev/null +++ b/control/monad.scm @@ -0,0 +1,39 @@ +(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 ...)))))) + |