はじめまして、
概要
'(+) または '(-) をデータとして cond (評価されない) に渡すのに問題があります。独自に、(+) または (-) を返し、引数として恒等要素 (0) を返します。
ヘルプ!
バックグラウンド。
コード内の非標準スキーム用。
この本では; 文はフラットなリストで、単語は記号と文字列です。トピックを説明するライブラリの一部である simple.scm には、every、keep、accumulate の 3 つの高次関数/手順があります。
- (すべての関数データ) [データのすべての要素に対してこの関数を実行]
- (predicate? data を保持) [predicate? data を渡す要素を保持? テスト]
- (accumulate function data) [すべてのデータを関数の形式に収集 — keep と組み合わせて無効なデータを削除] 例: (accumulate + (keep number? data)) [非数値を削除し、残りの数値を合計し、数値が見つからない場合はゼロ]
データフロー。
演習8.11は gpa 計算手順です。命令では、ラムダまたは再帰は許可されていません (シーケンシャルに読み取られた場合はまだ教えられていません)。
私が試した最初の実装では、1 つのセンテンスで複数の成績を取得し、それぞれのセンテンスを 1 つの成績で出力します。次に、この出力をヘルパー プロシージャに渡します。
単一グレードの出力に + または - が含まれる場合、たとえば '(a+) が '(a) と '(+) に分割され、すべての出力がさらにヘルパー プロシージャに渡されます。
次に、cond がスコアを割り当てます
a 4
b 3
c 2
d 1
e 0
+ 0.33
- -0.33
これは、私の頭の中でしか機能しませんでした (なぜコンピューターは心のように機能しないのですか?) '(a+) や '(a-) のようなグレードが分離されている場合、'(a) は適切に処理されますが、'(+) または'(-) は恒等要素 (0) に評価され、gpa への追加に失敗します。
'(+) と '(-) を式ではなくデータとして渡す方法はありますか? または、(0) を返す前に cond で使用できる任意のデータに変換できますか?
現在のバージョン、各学年の長いコンドは機能しますが、ひどいものです。関数型プログラミングではなく、実装が必須のように感じさせます。
コード。
間違ったgpaを返します(0.33または-0.33を追加しません):また、入力タイプのチェックイン(gpa-helper)が見事に失敗しました。
(define (gpa gradesset)
(/ (accumulate + (every gpa-helper gradesset)) (count gradesset)) )
(define (gpa-helper gradewrd)
(cond ((or (< (count gradewrd) 1) (> (count gradewrd) 2)) '(Please use valid grade input))
((= (count gradewrd) 1) (gpa-allocator (keep valid-grade? gradewrd)))
((= (count gradewrd) 2) (every gpa-helper (keep valid-grade? gradewrd)))
(else '(Please check that all grades entered are valid)) ) )
(define (gpa-allocator gradeletter+-)
(cond ((equal? gradeletter+- 'a) 4)
((equal? gradeletter+- 'b) 3)
((equal? gradeletter+- 'c) 2)
((equal? gradeletter+- 'd) 1)
((equal? gradeletter+- 'e) 0)
((equal? gradeletter+- +) .33)
((equal? gradeletter+- -) (- .33))
(else 0) ) )
(define (valid-grade? gradein)
(if (member? gradein '(+ - a+ a a- b+ b b- c+ c c- d+ d d- e)) #t #f) )
個々のスコアの文を返すやり直しバージョン。'(+) および '(-) によって返される 0 は、ここに表示されます。正常な入力型チェックを実装しますが、新しい問題が発生します。(1 つの結果を累積 + ing)
(define (gpa gradesset)
(every gpa-cleaner gradesset) )
(define (gpa-cleaner gradewrd)
(cond ((or (< (count gradewrd) 1) (> (count gradewrd) 2)) 0)
(else (every gpa-accumulator gradewrd)) ) )
(define (gpa-accumulator gradewrd)
(/ (accumulate + (every gpa-helper gradewrd)) (count gradewrd)) )
(define (gpa-helper gradewrd)
(cond ((= (count gradewrd) 1) (gpa-allocator (keep valid-grade? gradewrd)))
((= (count gradewrd) 2) (every gpa-helper (keep valid-grade? gradewrd)))
(else '(Please check that all grades entered are valid)) ) )
(define (gpa-allocator gradeletter+-)
(cond ((equal? gradeletter+- 'a) 4)
((equal? gradeletter+- 'b) 3)
((equal? gradeletter+- 'c) 2)
((equal? gradeletter+- 'd) 1)
((equal? gradeletter+- 'e) 0)
((equal? gradeletter+- +) .33)
((equal? gradeletter+- -) (- .33))
(else 0) ) )
(define (valid-grade? gradein)
(if (member? gradein '(+ - a b c d e)) #t #f) )
Slib 3b3 で SCM バージョン 5e7 を使用し、Simply Scheme で提供される追加のライブラリ (上記の背景の下に提供されているリンク — Simply.scm、functions.scm、ttt.scm、match.scm、database.scm) と、回答を入力するライブラリロードされたすべてのエクササイズに対して。