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)

Your annotation:

Enter a new annotation:

Your nick:
The title of your paste:
Your paste (mandatory) :
Which egg implements the CHICKEN wiki?
Visually impaired? Let me spell it for you (wav file) download WAV