我在調試case語句時遇到了一些麻煩。我希望這個陳述會給note-val
分配一個數值,但是到目前爲止它是分配#<void>
。我知道case語句有些問題,因爲如果我添加一個else子句,那麼就會應用該值。給定樣本輸入'(((#\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
,等等)。
嘛,狗屎感謝擡頭。你知道另一種方法去解決這個問題嗎,或者我堅持使用嵌套'if's的醜陋階梯? – Andy 2011-04-24 05:16:41
@Andrew:你可以使用'cond' .--) – 2011-04-24 05:16:59
A-ha!先生,你真棒。 – Andy 2011-04-24 05:24:13