私が取っているコンピュータ サイエンス コースでは、宿題として、メッセージ パッシングに関するいくつかの異なる質問を課されました。私は次のことを要求する1つを除くすべてを解決することができました:
(make-mailman)
パラメータを取らず、次のメッセージに応答するメッセージ パッシング オブジェクトを返すmailman オブジェクト ファクトリを作成します。
'add-to-route
: 任意の数のメールボックス オブジェクトを受け取り、それらを mailman オブジェクトの「ルート」に追加するプロシージャを返します</li>'collect-letters
: 任意の数の文字オブジェクトを受け取り、将来の配布のためにそれらを収集するプロシージャを返します'distribute
: 集められた各手紙を郵便配達員のルート上のメールボックスに追加します。住所は手紙の宛先と一致し、宛先がルート上のどのメールボックスとも一致しなかった手紙のリストを返します (注:'distribute
郵便配達員オブジェクトを通過するたびに、手紙を集めました。)
コードを簡単にするために与えられた注意事項には、次のものがあります。
1 回の配布ラウンドで複数のレターが同じメールボックスに配布された場合、それらのいずれかが
'get-latest-message
メールボックスに渡されてメッセージが返される「最新の」レターである可能性があります。2 つのメールボックスが同じアドレスを持つことはありません。
メールボックスまたは手紙が郵便配達員に 2 回以上渡されることはありません。
配布によって返される不良文字は、特定の順序である必要はありません。
. args
任意の数の引数を受け入れるための構文を使用します。
これは私が自分で理解できたことです:
(define (make-mailman)
(let ((T '()))
(define (route-adder . mobjects)
(assoc mobjects T))
(define (letter-collecter . lobjects)
(assoc lobjects T))
(define (add-to-route mobjects)
(begin (set! T (cons (route-adder . mobjects) T)) 'done))
(define (collect-letters lobjects)
(begin (set! T (cons (sort-strings (letter-collecter . lobjects)) T)) 'done))
(define (dispatch z)
(cond ((eq? z 'add-to-route) add-to-route)
((eq? z 'collect-letters) collect-letters)
((eq? z 'distribute) "unsure of what to do here")
(else "Invalid option")))
dispatch))
この問題をしばらく調べてみましたが、ここから何をすべきかわかりません。