racket-matrix-2012/chat-os2-paper.rkt

68 lines
1.7 KiB
Racket
Raw Normal View History

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)
2012-07-30 17:36:58 +00:00
(with-output-to-bytes
(lambda () (write v) (newline))))
2012-07-23 16:12:14 +00:00
;;---------------------------------------------------------------------------
2012-08-08 20:44:38 +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
2012-08-08 20:48:24 +00:00
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2012-07-23 16:12:14 +00:00
(define (connection-handler t)
(define me (gensym 'user))
2012-08-08 20:48:24 +00:00
(define-values (cin cout in-t out-t)
(tcp-accept t))
2012-07-23 16:12:14 +00:00
(transition 'no-state
2012-08-08 20:48:24 +00:00
(net-roles me cin cout in-t out-t)
2012-08-08 20:46:28 +00:00
(chat-roles me cout)))
2012-08-08 20:48:24 +00:00
2012-08-08 20:44:38 +00:00
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2012-08-08 20:48:24 +00:00
(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
2012-08-13 20:49:24 +00:00
#:on-absence (quit)
2012-08-08 22:23:50 +00:00
[(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
2012-08-08 20:48:24 +00:00
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(define (chat-roles me cout)
2012-07-23 16:12:14 +00:00
(define (announce t did-what)
2012-07-30 16:59:13 +00:00
(define who (first (topic-pattern t)))
(unless (equal? who me)
(at-meta-level
(cout (term->bytes
2012-07-30 16:59:13 +00:00
`(,who ,did-what))))))
(list
(role (topic-publisher `(,me says ,?)))
(role (topic-subscriber `(,? says ,?))
#: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
2012-07-30 17:36:58 +00:00
(ground-vm (spawn tcp-driver)
(spawn listener))
2012-08-08 20:44:38 +00:00
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;