1

caseステートメントのデバッグに問題があります。ステートメントがに数値を割り当てることを期待していましたnote-valが、これまでのところ、を割り当ててい#<void>ます。else句を追加すると、その値が適用されるため、caseステートメントに問題があることはわかっています。のサンプル入力を考えると、'(((#\3 #\A) (#\4 #\B)) ((#\4 #\C)))ここで何が間違っているのでしょうか。(caseステートメントに関して。他にもエラーがあると思いますが、これを修正できるのであれば、自分で解決してみたいと思います。)

(define (calc-freqs chord)
  (let ((octave (char->int (caaar chord)))
        (note-val (case (cdaar chord)
                    [((#\B #\#) (#\C))      0]
                    [((#\C #\#) (#\D #\b))  1]
                    [((#\D))                2]
                    [((#\D #\#) (#\E #\b))  3]
                    [((#\E) (#\F #\b))      4]
                    [((#\E #\#) (#\F))      5]
                    [((#\F #\#) (#\G #\b))  6]
                    [((#\G))                7]
                    [((#\G #\#) (#\A #\b))  8]
                    [((#\A))                9]
                    [((#\A #\#) (#\B #\b)) 10]
                    [((#\B) (#\C #\b))     11])))
    (cons (* a4 (expt 2 (+ (- octave 4) (/ (- note-val 9) 12))))
          (if (pair? (cdr chord))
              (calc-freqs (cdr chord))
              '()))))

ああ、それchar->intは私が書いた小さなユーティリティ関数であり、名前に書かれていることをほぼ実行します(#\1=>1など)。

4

2 に答える 2

3

caseを使用してマッチングを行いeqv?ます。つまり、記号、数字、文字、ブール値、または空のリスト以外は一致しません。

あなたの場合、あなたは(空でない)リストを一致させようとしていました。それは決してうまくいきません。:-((一致する文字列またはベクトルは機能しません。)

于 2011-04-24T05:14:16.957 に答える
3

前の回答に追加するには(コードを追加できるように):Racketを使用している場合は、「一致」フォームに興味があるかもしれません。

#lang racket

(require rackunit)

(define (pitchclass->half-steps pitchclass)
  (match pitchclass
    [(or "B#" "C")   0]
    [(or "C#" "Db")  1]
    ["D"             2]
    [(or "D#" "Eb")  3]
    [(or "E" "Fb")   4]
    [(or "E#" "F")   5]
    [(or "F#" "Gb")  6]
    ["G"             7]
    [(or "G#" "Ab")  8]
    ["A"             9]
    [(or "A#" "Bb") 10]
    [(or "B" "Cb")  11]))

;; TEST CASES:

(check-equal? (pitchclass->half-steps "Ab") 8)
(check-equal? (pitchclass->half-steps (apply string '(#\D #\#))) 3)

2番目のテストケースは、「charsのリスト」表現と実際に結婚している場合にこれをどのように使用するかを示しています。

于 2011-04-24T21:43:13.617 に答える