diff --git a/chat-os2-paper.rkt b/chat-os2-paper.rkt index 4ea8c23..10fa876 100644 --- a/chat-os2-paper.rkt +++ b/chat-os2-paper.rkt @@ -20,17 +20,31 @@ #:on-presence (spawn (connection-handler t)))))) +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (define (connection-handler t) (define me (gensym 'user)) - (define-values - (cin cout in-topic out-topic) + (define-values (cin cout in-t out-t) (tcp-accept t)) (transition 'no-state - (net-roles me cin cout - in-topic out-topic) + (net-roles me cin cout in-t out-t) (chat-roles me cout))) -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +(define (net-roles me cin cout in-t out-t) + (at-meta-level + (cout (term->bytes `(you-are ,me))) + (cin (tcp-mode 'lines)) + (cin (tcp-credit 1)) + (role out-t) + (role in-t + #:on-absence (kill) + [(tcp-channel _ _ (? bytes? line)) + (list (at-meta-level + (cin (tcp-credit 1))) + (send-message + `(,me says ,line)))]))) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (define (chat-roles me cout) (define (announce t did-what) (define who (first (topic-pattern t))) @@ -49,22 +63,6 @@ [msg (at-meta-level (cout (term->bytes msg)))]))) -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -(define (net-roles me cin cout - in-topic out-topic) - (at-meta-level - (cout (term->bytes `(you-are ,me))) - (cin (tcp-mode 'lines)) - (cin (tcp-credit 1)) - (role out-topic) - (role in-topic - #:on-absence (kill) - [(tcp-channel _ _ (? bytes? line)) - (list (at-meta-level - (cin (tcp-credit 1))) - (send-message - `(,me says ,line)))]))) - (ground-vm (spawn tcp-driver) (spawn listener))