calrissian/include/monads.lfe
Correl Roush 888effbf13 Rename 'do' to 'do-m'
'do' is a built-in lisp macro
2014-04-25 01:11:33 -04:00

25 lines
569 B
Text

(defmacro do-m args
(let ((monad (car args))
(statements (cdr args)))
(monad:do-transform monad statements)))
(defmacro >>= (monad m f)
`(: ,monad >>= ,m ,f))
(defmacro >> (monad m1 m2)
`(: ,monad >>= ,m1 (lambda (_) ,m2)))
(defmacro return (monad expr)
`(: ,monad return ,expr))
(defmacro sequence (monad list)
`(: lists foldr
(lambda (m acc) (mcons ,monad m acc))
(return ,monad [])
,list))
(defmacro mcons (monad m mlist)
`(do-m ,monad
(x <- ,m)
(rest <- ,mlist)
(return ,monad (cons x rest))))