継続を利用した疑似マルチスレッドをコーディング中 - 2

call/cc を用いた Coroutine の実装。
http://www.shido.info/lisp/scheme_cc.html を参考に単純化してやってみる。

中断するときに、call/cc で継続を取り出して queue に入れて、queue から次の処理を取り出して実行という形。
理解できた。
自前インタプリタでも動いた。当り前か。

(define queue (cons '() '()))

(define (enqueue! process)
  (if (null? (car queue))
      (set-car! queue process)
      (set-cdr! queue process)))

(define (dequeue!)
  (let ((p (cdr queue)))
    (set-cdr! queue (car queue))
    (set-car! queue '())
    p))

(define (coroutine process)
  (enqueue! process))

(define (start)
  (let ((process (dequeue!)))
    (if (null? process)
        'end
        (process))))

(define (pause)
  (call/cc (lambda (c)
             (coroutine (lambda () (c #f)))
             (start))))

(coroutine (lambda ()
               (let loop ((i 0))
                 (if (< i 10)
                     (begin
                       (print i)
                       (pause)
                       (loop (+ 1 i)))
                     #f))))

(coroutine (lambda ()
               (let loop ((i 10))
                 (if (< i 20)
                     (begin
                       (print i)
                       (pause)
                       (loop (+ 1 i)))
                     #f))))

(start)