aboutsummaryrefslogtreecommitdiff
path: root/control/monad.scm
blob: 2ef230c316dcf9329ac8db1c8f3e0aed11649beb (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
(define-module (control monad)
  #:use-module (control monad procedures)
  #:use-module (ice-9 match)
  #:export (do)
  #:re-export (>> >>=))

(define-syntax do
  (syntax-rules (<- let =)
    ((_ let ptrn = val rest ...)
     (match val
       (ptrn (do rest ...))))
    ((_ ptrn <- val rest ...)
     (>>= val (match-lambda (ptrn (do rest ...)))))
    ((_ a) a)
    ((_ token rest ...)
     (>> token (do rest ...)))))