0

次のコードを実行すると、結果の特定の場所でが繰り返し#<procedure:me>表示されますが、その理由がわかりません。

テストするには: 実行します(match-make men women)

コードは次のとおりです。

;;ラケットの互換性

(define (write-line x)
  (display x)
  (newline))

(define (append! a b)
  (if (null? (cdr a))
      (set-cdr! a b)
      (append! (cdr a) b)))

; これにより、マッチメイキングプログラムが開始され、 ; が取り込まれます。最初の提案者と提案者は、その状態をリセットし、それらを求愛手順に送ります。提案が始まります

(define (match-make proposers proposees)
  (send proposers 'reset)
  (send proposees 'reset)
  (courtship proposers proposers)
  (zip-together (send proposers 'name)
            (send (send proposers 'intended) 'name)))

; 関与していない各提案者は、 がなくなるまで提案します。より多くの未関与の提案者

(define (courtship unengaged-proposers proposers)
  (if (null? unengaged-proposers) 
      (display "match-make complete")
      (begin ((car unengaged-proposers) 'propose)
             (courtship (currently-unengaged unengaged-proposers) proposers))))

; 現在エンゲージしていない人を取得します

(define (currently-unengaged list-of-people)
  (filter unengaged list-of-people))

; 人が関与していないかどうかを確認します

(define (unengaged person)
  (if (null? (person 'intended))
      #t
      #f))

; 指定されたメッセージを各人に送信します。指定された人のリストで

(define (send list-of-people message)
  (if (null? list-of-people) 
      '()
      (begin ((car list-of-people) message) 
         (send (cdr list-of-people) message))))

; 指定された 2 人が ; かどうかを確認します。カップルです

(define (couple? person1 person2)
  (if ((eq? (person1 'intended) person2) #t)
      #t
      #f))

; 指定された 2 つのリストを結合します

(define (zip-together list1 list2)
  (if (null? list1)
      '()
      (cons (list (car list1) (car list2))
            (zip-together (cdr list1) (cdr list2)))))

; true である各要素を結合します。指定された述語

(define (filter pred lst)
  (cond ((null? lst) '())
        ((pred (car lst)) (cons (car lst) (filter pred (cdr lst))))
        (else (filter pred (cdr lst)))))

; 2 つのリスト (list1) ともう 1 つを取ります。任意の長さのリスト (list2) を返します。list1 の 2 つのうち、最初に表示される方。リスト2で

 (define (preference list1 list2)
  (write (list list1 list2))
   (cond ((eq? (car list1) (car list2)) (car list1))
        ((eq? (cadr list1) (car list2)) (cadr list1))
        (else (preference list1 (cdr list2)))))

; 特定の状態の人を作成します。および呼び出すことができる特定のメッセージ。その人に。私はどこにマークを付けました。問題1と問題2に追加されたのは; 表示と改行が表示されている場所

(define (make-person my-name)
  (let ((preference-list '())
       (possible-mates '())
       (current-intended '()))
    (define (i-like-more person1 person2)    ;Problem 1
      (preference (list person1 person2) preference-list)
      (cond ((eq? (car (me 'loves)) person1) #t)
            ((eq? (car (me 'loves)) person2) #f)
            (else (preference (list person1 person2) (cdr preference-list))))) 
    (define (me message)
       (cond ((eq? message 'name) my-name)
            ((eq? message 'intended) current-intended)
            ((eq? message 'loves) preference-list)
            ((eq? message 'possible) possible-mates)
            ((eq? message 'reset)
              (set! current-intended '())
              (set! possible-mates preference-list)
              'reset-done)
            ((eq? message 'load-preferences)
              (lambda (plist)
               (set! preference-list plist)
               (set! possible-mates plist)
               (set! current-intended '())
               'preferences-loaded))
            ((eq? message 'propose)
             (let ((beloved (car possible-mates)))
               (begin 
                 (set! possible-mates (cdr possible-mates))
                 (begin
                    (display (me 'name))
                    (display " proposed to ")
                    (display (beloved 'name))
                    (newline))
                 (if (eq? ((beloved 'i-love-you) me)
                          'i-love-you-too)
                      (begin 
                       (display (me 'name))
                       (display " and ") 
                       (display (beloved 'name)) 
                       (display " are engaged ")
                       (newline)
                       (set! current-intended beloved)
                       'we-are-engaged)
                     (begin 
                       (display "no one loves me") 
                       'no-one-loves-me)))))
             ((eq? message 'i-love-you)   ;Problem 1
              (lambda (proposer)
               (cond 
                  ((null? (me 'intended))
                  (begin 
                     (set! current-intended proposer)
                     (display (me 'intended))
                     (display " says i love you too")
                     (newline)
                     'i-love-you-too))
                  ((i-like-more proposer (me 'intended))
                    (begin 
                      (set! current-intended proposer)
                      (display (me 'intended))
                       (display " dumped ") 
                       (display (me 'intended))
                       (newline)
                  (((me 'intended) 'i-changed-my-mind) me)
                  'i-love-you-too))
              (else (begin 
                (display (me 'intended))
                (display " rejected ")
                (display (me 'name))
                'buzz-off-creep)))))
         ((eq? message 'i-changed-my-mind)
          (lambda (lost-love)
            (cond ((eq? current-intended lost-love)
                   (set! current-intended '())
                   'dumped!)
                  (else 
                   'there-must-be-some-misunderstanding))))
         (else 
          (display "Bad message to a person")
          (newline)
          (list my-name message))))
  me))

;; これはテストファイルです

(define alan (make-person 'Alan))
(define bob (make-person 'Bob))
(define charles (make-person 'Chuck))
(define david (make-person 'Dave))
(define ernest (make-person 'Ernie))
(define franklin (make-person 'Frank))
(define agnes (make-person 'Agnes))
(define bertha (make-person 'Bertha))
(define carol (make-person 'Carol))
(define deborah (make-person 'Debbie))
(define ellen (make-person 'Ellen))
(define francine (make-person 'Fran))

 ((alan 'load-preferences) 
  (list agnes carol francine bertha deborah ellen))
((bob 'load-preferences) 
  (list carol francine bertha deborah agnes ellen))
((charles 'load-preferences) 
 (list agnes francine carol deborah bertha ellen))
((david 'load-preferences) 
  (list francine ellen deborah agnes carol bertha))
((ernest 'load-preferences) 
  (list ellen carol francine agnes deborah bertha))
((franklin 'load-preferences) 
  (list ellen carol francine bertha agnes deborah))
((agnes 'load-preferences) 
 (list charles alan bob david ernest franklin))
((bertha 'load-preferences) 
 (list charles alan bob david ernest franklin))
((carol 'load-preferences) 
 (list franklin charles bob alan ernest david))
((deborah 'load-preferences) 
  (list bob alan charles franklin david ernest))
((ellen 'load-preferences) 
 (list franklin charles bob alan ernest david))
((francine 'load-preferences) 
 (list alan bob charles david franklin ernest))

(define men (list alan bob charles david ernest franklin))
(define women (list agnes bertha carol deborah ellen francine))
4

1 に答える 1

0

この質問は、コードの使用方法に関する情報と、個人オブジェクトへのメッセージを処理する関数の目的と使用法に関するコメントから恩恵を受けるでしょう。

ただし、問題は#<procedure:me>、プログラムの実行時に予想される文字列の代わりに表示されるようです。

表示されるのは、呼び出される代わりに返される関数です。これにはいくつかの理由があります。

  1. この関数は、人物オブジェクトのリストである最初の引数に対してpreference定義されます。write
  2. メッセージを処理するコードでは、(write (me 'intended))が使用されている(write (me 'name)か、使用(write ((me 'intended) 'name)されるべきでした。

また、次のように定義する必要がi-like-moreあります。preference

(define (i-like-more person1 person2)                       
   (eq? person1 (preference (list person1 person2) preference-list)))  
于 2013-03-20T21:11:33.097 に答える