Commit 81a9773 introduces a generic state monad in (guix monads), and
the next commit makes ‘%store-monad’ an alias for ‘%state-monad’.
The nice thing is that ‘%state-monad’ remains low-overhead thanks to the
macro tricks¹ and the use of multiple-value returns to thread the state
across monadic procedure calls:
--8<---------------cut here---------------start------------->8---
scheme@(guix monads)> ,optimize (mlet* %state-monad ((x (set-current-state 0))
(y (set-current-state 1))
(p (set-current-state 2))
(z (return (+ y p))))
(return z))
$14 = (lambda (state) (values 1 2))
--8<---------------cut here---------------end--------------->8---
Feedback welcome!
Ludo’.
¹ http://lists.gnu.org/archive/html/guix-devel/2013-10/msg00034.html