在过去的几天里,我一直在关注计划问题,包括创建一个消息传递过程,记录朋友列表,然后可以操纵该列表来更改在线或离线的特定朋友的价值。如果放入的人是朋友,则返回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