(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)