diff options
Diffstat (limited to 'control')
-rw-r--r-- | control/monad.scm | 39 | ||||
-rw-r--r-- | control/monad/procedures.scm | 17 |
2 files changed, 56 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 ...)))))) + diff --git a/control/monad/procedures.scm b/control/monad/procedures.scm new file mode 100644 index 0000000..701f871 --- /dev/null +++ b/control/monad/procedures.scm @@ -0,0 +1,17 @@ +(define-module (control monad procedures) + #:use-module (oop goops) + #:use-module (srfi srfi-1) ; concatenate! + #:export (>>=)) + +(define-generic >>=) + +(define-method (>>= (this <null>) + proc) + '()) +(define-method (>>= (this <pair>) + (proc <procedure>)) + (concatenate! (map proc this))) + +;; bind :: Monad m => m a -> (a -> m b) -> m b +;; return :: Monad m => a -> m a +;; map :: Functor f => (a -> b) -> f a -> f b |