gaupメモ
デバッグ中にだいたい読んだ感じでは、一番難しそうなのが以下の部分。
(define selector (make <selector>)) ; ..... (define (read-input) ; .... (call/cc (lambda (return) (let* ((path (format #f "/tmp/gaup~a-~a" gaup-pid gaup-cont)) (server (make-server-socket 'unix path))) (sys-chmod path #o777) ;;継続サーバの肝である"継続"は、このselector-add!のクロージャに保存しておく。 (selector-add! selector (socket-fd server) (lambda (fd flag) (let* ((client (socket-accept server)) (input (socket-input-port client)) (params (read input))) (socket-close client) (return params))) '(r))) (inc! gaup-cont) ;; 読み取り可能になるまで無限ループ (do () (#f) (selector-select selector)))))
call/ccはさておき、selectorとはなんだろう。
ああ、複数のサーバに対して同時にselectを掛けるのか。つまり、serverに対して何か入力があった場合は、(lambda (fd flag) ....)が実行されるわけだ。
でもって、selectorはグローバル変数だから、古いやつのも取っておかれるんだろう。なんで取っておかれるかは、まだわからない。
おお、なるほど。古いやつには、古い継続が保存されている。だから、それが実行されるたびに、過去の状態に戻ることができるんだっ。今、初めて継続サーバのポイントが実感できた気がする。