#lang racket/base (require racket/tcp) (require racket/port) (require racket/class) (require racket/match) (require "conversation.rkt") (require "standard-thread.rkt") (define r (make-room)) (standard-thread (lambda () (define handle (join-room r)) (send handle assert! (topic 'subscriber 'Any)) (send handle assert! (topic 'publisher 'Any)) (let loop () (define m (send handle listen)) ;;(write `(robot heard ,m)) (newline) (match m [(says _ "die") (error 'robot "Following orders!")] [(says (topic 'publisher _) _) (send handle say (topic 'subscriber 'Any) `(robot hears ,m))] [else (void)]) (loop)))) (define (interaction i o) (display "What is your name? > " o) (flush-output o) (define name (read-line i)) (if (eof-object? name) (begin (display "OK, bye then!" o) (flush-output o)) (let ((handle (join-room r))) (define talk-topic (topic 'publisher (list name 'Sink 'speech))) (define listen-topic (topic 'subscriber (list 'Speaker name 'speech))) (send handle assert! talk-topic) (send handle assert! listen-topic) (let loop () (display name o) (display "@ROOM>> " o) (flush-output o) (sync (handle-evt (send handle listen-evt) (lambda (m) (write `(,name hears ,m) o) (newline o) (match m [(says (topic 'publisher (list (== name) _ _)) _) (write `(,name not acking own utterance) o) (newline o)] [(says (and specific-topic (topic 'publisher _)) _) (write `(,name acking) o) (newline o) (send handle say specific-topic (list name 'ack))] [_ (void)]) (flush-output o) (loop))) (handle-evt (read-line-evt i 'any) (lambda (utterance) (when (equal? utterance "error") (error 'interaction "Following orders!")) (when (not (eof-object? utterance)) (send handle say talk-topic utterance) (loop))))))))) (standard-thread (lambda () (interaction (current-input-port) (current-output-port)))) (define port-number 5001) (display "Listening on port ") (display port-number) (newline) (let ((s (tcp-listen port-number 4 #t))) (let accept-loop () (define-values (i o) (tcp-accept s)) (standard-thread (lambda () (interaction i o) (close-input-port i) (close-output-port o))) (accept-loop)))