(define-syntax rdo
(syntax-rules (<- return)
[(rdo m var <- mexp rest ...)
((monad-bind m) mexp (match-lambda [var (rdo m rest ...)]))]
[(rdo m return value)
((monad-return m) value)]))
(define-syntax doLeftAcc
(syntax-rules (<- return)
[(doLeftAcc m acc accVar
var <- mexp
rest ...)
(doLeftAcc m
(rdo m
accVar <- acc
var <- mexp
return (list var accVar))
(list var accVar)
rest ...)]
[(doLeftAcc m acc accVar
return var)
(rdo m
accVar <- acc
return var)]))
(define-syntax ldo
(syntax-rules (<- return)
[(ldo m rest ...) (doLeftAcc m (rdo m return (list)) (list) rest ...)]))Tags: Scheme.