Scheme Case语句未赋值
我在调试案例陈述时遇到了一些问题。我本来希望该语句将为note val指定数值,但到目前为止它是赋值的。我知道case语句有问题,因为如果我添加一个else子句,就会应用该值。给定'\3\a\4\B\4\C'的示例输入,我在这里做错了什么?关于案件陈述。我肯定还有其他错误,但如果我能把它修好的话,我想试着自己解决这些问题Scheme Case语句未赋值,scheme,racket,case-statement,Scheme,Racket,Case Statement,我在调试案例陈述时遇到了一些问题。我本来希望该语句将为note val指定数值,但到目前为止它是赋值的。我知道case语句有问题,因为如果我添加一个else子句,就会应用该值。给定'\3\a\4\B\4\C'的示例输入,我在这里做错了什么?关于案件陈述。我肯定还有其他错误,但如果我能把它修好的话,我想试着自己解决这些问题 (define (calc-freqs chord) (let ((octave (char->int (caaar chord))) (note-v
(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中的功能,依此类推。case使用eqv?进行匹配?。这意味着符号、数字、字符、布尔值或空列表以外的任何内容都不会匹配
在您的例子中,您试图匹配非空列表。那是行不通的匹配字符串或向量也不起作用。case使用eqv?进行匹配?。这意味着符号、数字、字符、布尔值或空列表以外的任何内容都不会匹配
在您的例子中,您试图匹配非空列表。那是行不通的匹配字符串或向量都不起作用。以允许我添加代码的方式添加到先前的答案中:如果您使用的是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)
第二个测试用例说明了如果您真的与chars表示列表结为夫妻,您可以如何使用此选项。以允许我添加代码的方式添加到先前的答案中:如果您使用的是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)
第二个测试用例说明了如果您真的与chars表示列表结了婚,您可以如何使用它。哦,该死的。谢谢你的提醒。你知道另一种方法吗?或者我被困在一个丑陋的阶梯式嵌套ifs里了吗?@Andrew:你可以用cond-好吧,妈的。谢谢你的提醒。你知道另一种方法吗?或者我被困在一个丑陋的阶梯式嵌套ifs里了吗?@Andrew:你可以用cond-