aboutsummaryrefslogtreecommitdiff
path: root/control/monad.scm
diff options
context:
space:
mode:
Diffstat (limited to 'control/monad.scm')
-rw-r--r--control/monad.scm39
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 ...))))))
+