#lang scheme (define-struct robot (continuation continuation-tag) #:mutable) (define (create-robot) (make-robot (void) (make-continuation-prompt-tag))) (define (step-robots! robots) (for ((robot (in-list robots))) (cond ((void? (robot-continuation robot)) (start-robot! robot)) ((continuation? (robot-continuation robot)) (enter-robot! robot)) (else (display 'died) (newline)))) (step-robots! robots)) (define (start-robot! robot) (define continuation-tag (robot-continuation-tag robot)) (set-robot-continuation! robot #f) (set-robot-continuation! robot (call-with-continuation-prompt (lambda () (call-with-current-continuation (lambda (new-framework-continuation) (set-robot-continuation! robot new-framework-continuation) (exit-robot! robot) (do-robot! robot) (done-robot! robot)) continuation-tag)) continuation-tag)) (void)) (define (enter-robot! robot) (define continuation-tag (robot-continuation-tag robot)) (define old-behaviour-continuation (robot-continuation robot)) (set-robot-continuation! robot #f) (set-robot-continuation! robot (call-with-continuation-prompt (lambda () (call-with-current-continuation old-behaviour-continuation continuation-tag)) continuation-tag)) (void)) (define (exit-robot! robot) (define continuation-tag (robot-continuation-tag robot)) (define old-framework-continuation (robot-continuation robot)) (set-robot-continuation! robot #f) (set-robot-continuation! robot (call-with-current-continuation old-framework-continuation continuation-tag)) (void)) (define (done-robot! robot) (define old-framework-continuation (robot-continuation robot)) (set-robot-continuation! robot #f) (old-framework-continuation #f)) (define (do-robot! robot (steps 10000)) (unless (zero? steps) (exit-robot! robot) (do-robot! robot (- steps 1)))) (define robots (list (create-robot) (create-robot) (create-robot))) (step-robots! robots)