calrissian/include/monads.lfe

44 lines
1.2 KiB
Text
Raw Permalink Normal View History

2014-07-10 02:28:06 +00:00
(defmacro monad (name)
(case name
;; Provide the state monad in terms of the state transformer
(''state `(transformer 'state 'identity))
(_
2015-05-22 00:14:39 +00:00
`(list_to_atom (lists:flatten `("calrissian-"
,(atom_to_list ,name)
"-monad"))))))
2014-07-10 02:28:06 +00:00
(defmacro transformer (name inner-monad)
2015-05-22 00:14:39 +00:00
`(tuple (list_to_atom (lists:flatten `("calrissian-"
,(atom_to_list ,name)
"-transformer")))
2014-07-10 02:28:06 +00:00
(monad ,inner-monad)))
(defmacro do-m args
2014-04-24 19:33:28 +00:00
(let ((monad (car args))
(statements (cdr args)))
2014-07-10 01:19:14 +00:00
(calrissian-monad:do-transform monad statements)))
2014-04-24 19:33:28 +00:00
(defmacro >>= (monad m f)
`(call ,monad '>>= ,m ,f))
2014-04-24 19:33:28 +00:00
(defmacro >> (monad m1 m2)
`(call ,monad '>>= ,m1 (lambda (_) , m2)))
2014-04-24 19:33:28 +00:00
(defmacro return (monad expr)
`(call ,monad 'return ,expr))
2014-04-25 05:06:19 +00:00
2014-04-25 05:27:13 +00:00
(defmacro fail (monad expr)
`(call ,monad 'fail ,expr))
2014-04-25 05:27:13 +00:00
2014-04-25 05:06:19 +00:00
(defmacro sequence (monad list)
2015-05-22 00:14:39 +00:00
`(lists:foldr
2014-04-25 05:06:19 +00:00
(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))))