aboutsummaryrefslogtreecommitdiff
path: root/control/monad/state.scm
diff options
context:
space:
mode:
Diffstat (limited to 'control/monad/state.scm')
-rw-r--r--control/monad/state.scm29
1 files changed, 15 insertions, 14 deletions
diff --git a/control/monad/state.scm b/control/monad/state.scm
index 7e81b38..a8e7775 100644
--- a/control/monad/state.scm
+++ b/control/monad/state.scm
@@ -40,25 +40,26 @@
(let ((st-list-b ((proc a) st-list-a)))
((proc b) st-list-b))))
-(define (return-state v)
+(define-syntax define-stateful
+ (syntax-rules ()
+ ((_ ((proc args ...) st) body ...)
+ (define (proc args ...)
+ (make-state
+ (lambda (st) body ...))))))
+
+(define-stateful ((return-state v) st-list)
"Sets the return value to v"
- (make-state
- (lambda (st-list)
- (cons v (cdr st-list)))))
+ (cons v (cdr st-list)))
-(define (get)
+(define-stateful ((get) st-list)
"Sets the return value of state to st."
- (make-state
- (lambda (st-list)
- (match st-list
- ((_ st)
- (list st st))))))
+ (match st-list
+ ((_ st)
+ (list st st))))
-(define (put v)
+(define-stateful ((put v) st-list)
"Sets st to v."
- (make-state
- (lambda (st-list)
- (list '() v))))
+ (list '() v))
(define-method (run-state st-proc init)
"Exec state with init as starting state value and st."