2

'get-student-average 'get-assignment-average現在、課題の一環として、3つのメッセージを受け取り'add-grade、必要に応じて情報を返すスキームプログラムを作成しようとしています。'add-grade基本的に、学生ID、課題、成績がこの順序で挿入されたときに与えられます。私はまだ生徒と課題の平均メッセージに取り組んでいます(したがって、それらの前にセミコロンがあります)が、実行しようとすると失敗し続けるのは'add-gradeメッセージです。成績は無制限の変数であると言い続けています。これは私がテストしているコードです:

(define (make-grades)
  (define T '())
  (define (dispatch op)
    ((eq? op 'add-grade) (lambda(id as gr) (set! T (append T (list (list id as gr)
    )))))
   ;((eq? op 'get-student-average) (lambda(x) ( )))
   ;((eq? op 'get-assignment-average)
))

(define grades (make-grades))
((grades 'add-grade) 7 1 85))

それで情報を取り戻そうとするのが間違っているのは何なのかわかりません。スキーム内のテーブルと同様に、トリックはリストをリストとしてnull値に追加し、それを設定することだと思いました。

他にもたくさんのテストケース('averageメッセージのテストケースを含む)がありますが、同じことを繰り返しているだけだと感じたので、それらを含めませんでした。私が言及しなければならないもう1つのことは、すべてのテストケースが、で始まり、'(で終わるリスト内にまとめられているということ)です。

4

1 に答える 1

4

コードにはいくつか問題があります。手始めに、実際に受信しているメッセージを確認しているわけではありません(condまたは、一連のネストされた、ifまたはcaseどこかにあるはずです)。そして、あなたはディスパッチャプロシージャを返していません。ここで、これを試して開始します。

(define (make-grades)
  (define T '())
  (define (dispatch op)
    (cond ((eq? op 'add-grade)
           (lambda (id as gr)
             (set! T (append T (list (list id as gr))))))
          ;((eq? op 'get-student-average) (lambda(x) ( )))
          ;((eq? op 'get-assignment-average)
          ))
  dispatch)

また、テスト目的で、リストを返すために4番目のメッセージを追加する必要があります。

于 2012-11-27T22:30:54.627 に答える