Skip to content

Instantly share code, notes, and snippets.

@WillNess
Forked from anonymous/gist:5574919
Last active December 17, 2015 07:48
Show Gist options
  • Save WillNess/5574924 to your computer and use it in GitHub Desktop.
Save WillNess/5574924 to your computer and use it in GitHub Desktop.
(define (make-letter destination message)
(define (dispatch x)
(cond ((eq? x 'get-destination) destination)
((eq? x 'get-message) message)
(else "Invalid option.")))
dispatch)
(define (make-mailbox address)
(let ((T '()))
(define (add-post letter)
(begin (set! T (cons letter T)) 'done))
(define (get-latest-letter)
(if T (car T)))
(define (dispatch y)
(cond ((eq? y 'add-letter) add-post)
((eq? y 'get-latest-message) ;;;;;; (get-previous-post T))
get-latest-letter)
((eq? y 'get-address) address)
(else "Invalid option.")))
dispatch))
(define (find-mailbox address mailboxes) ; general utility
(if (not (null? mailboxes))
(if (equal? address ((car mailboxes) 'get-address))
(car mailboxes)
(find-mailbox address (cdr mailboxes)))))
(define (make-mailman)
(let ((self (list '(ROUTE)
'(MAILBAG))))
(define (add-to-route . mailboxes)
(let ((route (assoc 'ROUTE self)))
(set-cdr! route (append mailboxes (cdr route))) 'DONE))
(define (collect-letters . letters)
(let ((mailbag (assoc 'MAILBAG self)))
(set-cdr! mailbag (append letters (cdr mailbag))) 'DONE))
(define (distribute-the-letters)
(let* ((mailbag (assoc 'MAILBAG self))
(mailboxes (cdr (assoc 'ROUTE self)))
(letters (cdr mailbag)))
(if (null? letters)
()
(let loop ((letter (car letters))
(letters (cdr letters))
(not-delivered ()))
(let* ((address (letter 'get-destination)) ;;;;;; correct name
(mbox (find-mailbox address mailboxes)))
(if mbox
((mbox 'add-letter) letter)
(set! not-delivered (cons letter not-delivered)))
(if (null? letters)
(begin (set-cdr! mailbag '()) not-delivered)
(loop (car letters) (cdr letters) not-delivered)))))))
(define (dispatch z)
(cond ((eq? z 'add-to-route) add-to-route)
((eq? z 'collect-letters) collect-letters)
((eq? z 'distribute) distribute-the-letters)
(else "Invalid option")))
dispatch))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment