在過去的幾天裏,我一直在關注計劃問題,包括創建一個消息傳遞過程,記錄朋友列表,然後可以操縱該列表來更改在線或離線的特定朋友的價值。如果放入的人是朋友,則返回true。如果尚未添加,則返回false。它還可以顯示在線朋友的列表,以及您擁有的另一個列表。基本上,這個想法是讓一些可以改變的Facebook追蹤器。它響應4個輸入:'添加',切換狀態,'在線朋友和'朋友。麻省理工學院計劃消息傳遞列表布爾
這是我已經成功至今獲得:
(define (sort-strings lst)
(sort lst string<?))
(define (make-facebook-list)
(let ((T '()))
(define (dispatch x)
(define (add-person name)
(set! T (cons (cons name #f) T))
'done)
(define (online? friend)
(eq? friend #t))
(define (toggle-status! name)
(begin ;(if() (set! T (cons (cons name #t) T)))
(if (member name T)
(set-cdr! T (cons (cons name (not (cdr name)) T))))
(if (member name T) #t #f)))
(define (get-online-friends!)
(sort-strings (filter online? T)))
(define (get-friends!)
(sort-strings T))
(cond ((eq? x 'add) add-person)
((eq? x 'toggle-status) toggle-status!)
((eq? x 'get-online-friends) (get-online-friends!))
((eq? x 'get-friends) (get-friends!))
(else (error "Unknown Request" x))))
dispatch))
而這些是我使用的測試案例:
(define my-lst (make-facebook-list))
(display ((my-lst 'add) "Francis"))(newline) ; should return 'done
(display ((my-lst 'add) "Adrian"))(newline) ; should return 'done
(display ((my-lst 'add) "Zule"))(newline) ; should return 'done
(display ((my-lst 'add) "Geralt"))(newline) ; should return 'done
(display ((my-lst 'add) "Dexter"))(newline) ; should return 'done
(display ((my-lst 'add) "Leonidas"))(newline) ; should return 'done
(display ((my-lst 'toggle-status) "Leonidas"))(newline) ; should return #t
(display ((my-lst 'toggle-status) "Francis"))(newline) ; should return #t
(display ((my-lst 'toggle-status) "Zule"))(newline) ; should return #t
(display ((my-lst 'toggle-status) "Xavier"))(newline) ; should return #f
(display (my-lst 'get-online-friends))(newline) ; should return ("Francis" "Leonidas" "Zule")
(display (my-lst 'get-friends)) ; should return ("Adrian" "Dexter" "Francis" "Geralt" "Leonidas" "Zule")
我知道他們不會全部現在工作,這就是爲什麼我評論了一些程序。我試圖正確運行的那個是將狀態切換到在線或離線狀態的過程。我被引導認爲「成員」是用來檢查某個值是否是列表的一部分。我是否以這種錯誤的方式去做?
注意:排序字符串過程旨在與返回朋友列表的過程一起使用,以便按字母順序保留它們。
我改變了原來問題的措辭。我還決定使用ifs而不是conds,因爲我覺得佈局更適合這類問題。 – CodeRook
我不同意你:)。你的代碼變得不那麼可讀了。嵌套'if'與'cond'-表達式相同,你也可以做更多的抽象。我也認爲你的代碼中存在一些關於'eq?'和'equal?'的錯誤概念。我會爲我的答案添加一個關於「make-facebook-list」的建議。 – 2012-12-09 22:17:21
你抓到我了!事實是,我更容易理解if而不是cond的簡單語法,因爲在過去的問題中,我對佈局更加熟悉。 – CodeRook