1

成績のリストを取得して GPA を出力する Grade Point Average (GPA) を計算するプログラムを作成しようとしています。(宿題ではなく、練習として)。

テストケース:

(GPA? '(A C B B)) 
3.0

これが私の最善の推測です:

(define a 4.0)
(define b 3.0)
(define c 2.0)
(define d 1.0)
(define f 0.0)


(define (mysum lst)
  (let loop ((lst lst) (accum 0))
    (cond
      [(null? lst) accum]
      [else (loop (cdr lst) (+ accum (car lst)))])))

次のエラーが表示されます。

「+ の例外: a は数値ではありません」

テストケースを実行すると:

(mysum '(1 2 3 a))

10 を返す必要がありますが、プロシージャで a を 4.0 として定義してはなりません。

誰かがこの問題を簡単に説明できますか?

4

2 に答える 2

4

代わりにこれを試してください:

(mysum (list 1 2 3 a))

これはスコーピングの問題ではなく、引用に関するちょっとした誤解です。これを書くとき:

'(1 2 3 a)

あなたが言っている: 私は要素を持つリストが欲しい1, 2, 3, a. 引用符を使用する必要がある場合、a変数を評価するための正しい構文は次のとおりです。

`(1 2 3 ,a)
=> '(1 2 3 4.0)

...しかし、この場合list、新しいリストを構築するための手順を使用する方が簡単です:

(list 1 2 3 a)
=> '(1 2 3 4.0)

記録のために、次のようにリスト内のすべての要素を簡単に追加できます。

(apply + (list 1 2 3 a))
=> 10
于 2012-10-30T21:44:35.587 に答える
2

'(1 2 3 a)は の略で、逐語的なリストが の引数になる(quote (1 2 3 a))ことを意味します。引用符の下で変数値を展開しようとする試みは決して行われません。そこに文字を書くと、その文字がリストに必要なものであると見なされます。特に、4 番目の要素リストはシンボルであり、名前がそのシンボルである変数の値ではありません。(1 2 3 a)mysuma

変数の値を補間したい場合listは、他の回答のように使用できます。

(mysum (list 1 2 3 a))

またはquasiqoute:

(mysum `(1 2 3 ,a))
于 2012-10-30T21:48:19.343 に答える