2012-12-09 47 views
0

在過去的幾天裏,我一直在關注計劃問題,包括創建一個消息傳遞過程,記錄朋友列表,然後可以操縱該列表來更改在線或離線的特定朋友的價值。如果放入的人是朋友,則返回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") 

我知道他們不會全部現在工作,這就是爲什麼我評論了一些程序。我試圖正確運行的那個是將狀態切換到在線或離線狀態的過程。我被引導認爲「成員」是用來檢查某個值是否是列表的一部分。我是否以這種錯誤的方式去做?

注意:排序字符串過程旨在與返回朋友列表的過程一起使用,以便按字母順序保留它們。

+0

我改變了原來問題的措辭。我還決定使用ifs而不是conds,因爲我覺得佈局更適合這類問題。 – CodeRook

+0

我不同意你:)。你的代碼變得不那麼可讀了。嵌套'if'與'cond'-表達式相同,你也可以做更多的抽象。我也認爲你的代碼中存在一些關於'eq?'和'equal?'的錯誤概念。我會爲我的答案添加一個關於「make-facebook-list」的建議。 – 2012-12-09 22:17:21

+0

你抓到我了!事實是,我更容易理解if而不是cond的簡單語法,因爲在過去的問題中,我對佈局更加熟悉。 – CodeRook

回答

2

你的朋友是begin,迫使下面的表達式進行評估順序:

(define (make-facebook-list) 
    (define T '()) 
    (define (dispatch x) 
    (lambda (fl) 
     (cond ((eq? x 'add) 
      (begin 
       (set! T (append T (list fl))) 
       'done)) 
      (else 'invalid)))) 
    dispatch) 

[email protected](guile-user)> (define my-lst (make-facebook-list)) 
[email protected](guile-user)> ((my-lst 'add) "Francis") 
$1 = done 

編輯

(define (make-facebook-account) 
    (let ((*facebook-friends* '())) 
    (define (sort-alphabetically sequence) 
     (sort-list sequence string<?)) 
    (define (friend name) 
     (assoc name *facebook-friends*)) 
    (define (friends-name friend) 
     (car friend)) 
    (define (friends-status friend) 
     (cdr friend)) 
    (define (online? friend) 
     (eq? (friends-status friend) #t)) 
    (define (friend-on-facebook? name) 
     (if (member (friend name) 
        *facebook-friends*) 
      #t #f)) 
    (define (add-person! name) 
     (begin 
     (set! *facebook-friends* 
       (cons (cons name #f) 
        *facebook-friends*)) 
     'done)) 
    (define (toggle-status! name) 
     (if (friend-on-facebook? name) 
      (begin 
      (set-cdr! (friend name) 
         (if (online? (friend name)) 
          #f #t)) 
      'done) 
      (error 
      "Person no friend on facebook -- TOGGLE-STATUS!" name))) 
    (define (get-friends table) 
     (sort-alphabetically 
     (map friends-name table))) 
    (define (get-online-friends table) 
     (get-friends 
     (filter online? table))) 
    (define (dispatch m) 
     (cond ((eq? m 'add!) add-person!) 
      ((eq? m 'toggle-status!) toggle-status!) 
      ((eq? m 'get-friends) 
      (get-friends *facebook-friends*)) 
      ((eq? m 'get-online-friends) 
      (get-online-friends *facebook-friends*)) 
      ((eq? m 'friend-on-facebook?) friend-on-facebook?) 
      (else 
      (error "Unknown request -- DISPATCH" m)))) 
    dispatch)) 
+1

謝謝路德維希。我已經忘記了開始。 – CodeRook

+0

只是一個簡單的問題:當談到返回(排序)的朋友列表,我基本上只是返回表? – CodeRook

+0

@加貝:當然!我再次更新了代碼:) – 2012-12-09 23:11:07

相關問題