У меня проблемы с отладкой оператора case. Я надеялся, что оператор присваивает числовые значения note-val
, но пока он присваивает #<void>
. Я знаю, что с оператором case что-то не так, потому что, если я добавлю предложение else, это значение будет применено. Учитывая пример ввода '(((#\3 #\A) (#\4 #\B)) ((#\4 #\C)))
, что я здесь не так делаю? (Что касается описания случая. Я уверен, что есть и другие ошибки, но я хотел бы попытаться устранить их самостоятельно, если смогу исправить это.)
(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
и т. Д.).