Welcome to the CHICKEN Scheme pasting service
why even? pasted by anandamide on Tue Apr 19 21:23:03 2016
(let ((ret #f) (toggle-a #t) (toggle-b #f) (save-point #f) (vals '(a b c d e f)) (refs '(1 0 3 1 4 4 5))) (let ((generator (call/cc (lambda (yield) (let ((a (lambda (cc) (let loop () (set! ret (list-ref vals (car refs))) (set! refs (cdr refs)) (call/cc (lambda (k) (set! save-point k))) (cond ((eq? toggle-a #t) (set! toggle-a #f) (set! toggle-b #t) (yield ret)) ((eq? toggle-b #t) (set! cc (call/cc cc)) (loop)))))) (b (lambda (cc) (let loop () (set! ret (list-ref vals (car refs))) (set! refs (cdr refs)) (call/cc (lambda (k) (set! save-point k))) (cond ((eq? toggle-b #t) (set! toggle-b #f) (set! toggle-b #t) (yield ret)) ((eq? toggle-b #t) (set! cc (call/cc cc)) (loop)))))) (if (eq? save-point #f) (a b) (save-point '())))))))) (generator))) ;should output badbeef if generator called appropriate number of times
simple example added by Kooda on Tue Apr 19 21:51:17 2016
(define (counter _) (let ((return identity)) (let loop ((n 0)) ;; yield (if (call/cc (lambda (k) (set! counter (lambda (outer) (set! return outer) (k #t))) #f)) (loop (add1 n)) ;; code executed at resume (return n) ;; value returned by the yield )))) ;; to run it: ;; (call/cc counter)