smalltalk-tng
diff experiments/monad/general-monad.scm @ 323:454c18798969
merger
| author | Tony Garnock-Jones <tonygarnockjones@gmail.com> |
|---|---|
| date | Tue Feb 07 11:34:20 2012 -0500 (3 months ago) |
| parents | 9e14ff21779b |
| children |
line diff
1.1 --- a/experiments/monad/general-monad.scm Fri May 12 05:09:25 2006 +1200 1.2 +++ b/experiments/monad/general-monad.scm Tue Feb 07 11:34:20 2012 -0500 1.3 @@ -35,23 +35,9 @@ 1.4 (cond 1.5 ((pair? m) (make-monad *list* m)) 1.6 ((null? m) (make-monad *list* m)) 1.7 - ((monad? m) (if (eq? (monad-kind m) '_delayed) 1.8 - ((monad-value m)) 1.9 - m)) 1.10 + ((monad? m) m) 1.11 (else (error "not a monad" m)))) 1.12 1.13 -(define-syntax delay-monad 1.14 - (syntax-rules () 1.15 - ((_ m) (delay-monad* (lambda () (undelay-monad m)))))) 1.16 - 1.17 -(define (delay-monad* m) 1.18 - (make-monad '_delayed m)) 1.19 - 1.20 -(define (undelay-monad m) 1.21 - (if (and (monad? m) (eq? (monad-kind m) '_delayed)) 1.22 - ((monad-value m)) 1.23 - m)) 1.24 - 1.25 (define (>>= ma a->mb) 1.26 (let ((ma (monadize ma))) 1.27 (if (determined? ma) 1.28 @@ -106,14 +92,19 @@ 1.29 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 1.30 1.31 (define *io* (make-monad-class 'io 1.32 - (lambda (io1 f) (delay-monad (f (run-io io1)))) 1.33 + (lambda (io1 f) (make-monad *io* (cons (io-action io1) f))) 1.34 (lambda (v) (make-monad *io* (lambda () v))) 1.35 error)) 1.36 1.37 (define io-action (monad-arg *io*)) 1.38 1.39 (define (run-io m) 1.40 - ((io-action m))) 1.41 + (let run-action ((action (io-action m))) 1.42 + (if (pair? action) 1.43 + (let ((previous-action (car action)) 1.44 + (continuation (cdr action))) 1.45 + (run-io (continuation (run-action previous-action)))) 1.46 + (action)))) 1.47 1.48 (define (mdisplay x) 1.49 (make-monad *io* (lambda () (display x) 'done)))
