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")

それらのすべてが今すぐに機能するとは限らないことはわかっているため、一部の手順をコメントアウトしました。私が正しく実行しようとしているのは、ステータスをオンラインまたはオフラインに切り替える手順です。「メンバー」は、特定の値がリストの一部であるかどうかを確認するために使用されると信じ込まされてきました.これについて間違った方法をとっていますか?

注: sort-strings プロシージャは、友達のリストを返すプロシージャと一緒に使用して、アルファベット順に並べることを意図しています。

4

1 に答える 1

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)

scheme@(guile-user)> (define my-lst (make-facebook-list))
scheme@(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))
于 2012-12-09T19:49:15.217 に答える