It could be adapted for other monads if it also took return and (>>=) as arguments.
(mac w/ (monad x . rest) (w/uniq (gmonad) ((afn (x rest) (if (no rest) `(let ,gmonad ,monad ,x) (self `((car ,gmonad) (fn (_) ,(car rest)) ,x) (cdr rest)))) `((cdr ,gmonad) ,x)))) (= list-ret list) (= list-bind mappend) (= list-monad (cons list-bind list-ret)) (w/ list-monad 10 (list (- _ 1) _ (+ _ 1)) (list _ (* _ 2) (* _ 3))) ===> (9 18 27 10 20 30 11 22 33)