#lang racket/base (require "standard-thread.rkt") (require "conversation.rkt") (require racket/set) (require racket/match) (require racket/class) (define r (make-room)) (define t1 (standard-thread (lambda () (define h (join-room r)) (error 'omg "t1 exiting")))) (define t2 (standard-thread (lambda () (define h (join-room r)) (+ 1 2)))) (define t3 (standard-thread (lambda () (define h (join-room r)) (send h depart 'here-is-my-reason)))) (define h (join-room r)) (let loop ((seen (set)) (count 0)) (define m (send h listen)) (write m) (newline) (match m ((arrived who) (loop (set-add seen who) (+ count 1))) ((departed _ _) (if (and (= count 1) (= (set-count seen) 3)) 'done (loop seen (- count 1)))) (else (loop seen count))))