我在调试 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
等等)。