2012-07-23 16:12:14 +00:00
|
|
|
#lang racket/base
|
|
|
|
|
|
|
|
(require racket/list)
|
|
|
|
(require racket/port)
|
|
|
|
(require racket/match)
|
|
|
|
(require "os2.rkt")
|
|
|
|
(require "fake-tcp.rkt")
|
|
|
|
|
|
|
|
(define (term->bytes v)
|
|
|
|
(with-output-to-bytes (lambda () (write v) (newline))))
|
|
|
|
|
|
|
|
;;---------------------------------------------------------------------------
|
|
|
|
|
2012-07-23 19:21:30 +00:00
|
|
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
2012-07-23 21:42:18 +00:00
|
|
|
(define listener
|
|
|
|
(nested-vm
|
|
|
|
(at-meta-level
|
|
|
|
(role (tcp-listener 5999)
|
|
|
|
#:topic t
|
|
|
|
#:on-presence
|
|
|
|
(spawn (connection-handler t))))))
|
2012-07-23 16:12:14 +00:00
|
|
|
|
|
|
|
(define (connection-handler t)
|
|
|
|
(define me (gensym 'user))
|
2012-07-23 19:21:30 +00:00
|
|
|
(define-values
|
|
|
|
(cin cout in-topic out-topic)
|
|
|
|
(tcp-accept t))
|
2012-07-23 16:12:14 +00:00
|
|
|
(transition 'no-state
|
2012-07-23 19:21:30 +00:00
|
|
|
(chat-roles me cout)
|
|
|
|
(net-roles me
|
|
|
|
cin cout
|
|
|
|
in-topic out-topic)))
|
|
|
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
2012-07-23 16:12:14 +00:00
|
|
|
|
2012-07-23 19:21:30 +00:00
|
|
|
(define (chat-roles me cout)
|
2012-07-23 16:12:14 +00:00
|
|
|
(define (announce t did-what)
|
|
|
|
(unless (equal? (speaker t) me)
|
2012-07-23 19:21:30 +00:00
|
|
|
(at-meta-level
|
|
|
|
(cout (term->bytes
|
|
|
|
`(,(speaker t)
|
|
|
|
,did-what))))))
|
|
|
|
(list
|
|
|
|
(role (topic-publisher
|
|
|
|
`(,me says ,(wild))))
|
|
|
|
(role (topic-subscriber
|
|
|
|
`(,(wild) says ,(wild)))
|
|
|
|
#:topic t
|
|
|
|
#:on-presence (announce t 'arrived)
|
|
|
|
#:on-absence (announce t 'departed)
|
|
|
|
[msg (at-meta-level
|
|
|
|
(cout (term->bytes msg)))])))
|
2012-07-23 16:12:14 +00:00
|
|
|
|
|
|
|
(define (speaker t)
|
|
|
|
(first (topic-pattern t)))
|
|
|
|
|
2012-07-23 19:21:30 +00:00
|
|
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
|
|
(define (net-roles me
|
|
|
|
cin cout
|
|
|
|
in-topic out-topic)
|
2012-07-23 16:12:14 +00:00
|
|
|
(at-meta-level
|
2012-07-23 19:21:30 +00:00
|
|
|
(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)))])))
|
2012-07-23 16:12:14 +00:00
|
|
|
|
|
|
|
(ground-vm
|
2012-07-23 21:42:18 +00:00
|
|
|
(spawn tcp-driver)
|
|
|
|
(spawn listener))
|
2012-07-23 19:21:30 +00:00
|
|
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|