継続を利用した疑似マルチスレッドをコーディング中 - 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)