machine/threaded.ss
#lang scheme/base
(require scheme/control)
(provide make-counter state)
(define state (make-parameter #f))

(define (suspend/param param)
  (let ((state+value
         (let ((state (param)))
           (shift k
             (lambda (value)
               (k (cons state value)))))))
    (param (car state+value))
    (cdr state+value)))

(define (make-counter)
  (reset
   (parameterize ((state 0))
     (let loop ()
       (printf "state = ~s\n" (state))
       (let ((hole (suspend/param state)))
         (printf "hole = ~s\n" hole))
       (state (add1 (state)))
       (loop)))))