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はグローバル変数だから、古いやつのも取っておかれるんだろう。なんで取っておかれるかは、まだわからない。

おお、なるほど。古いやつには、古い継続が保存されている。だから、それが実行されるたびに、過去の状態に戻ることができるんだっ。今、初めて継続サーバのポイントが実感できた気がする。