我的应用程序建模钢琴键,我正试图为它们编写规格。我的初始尝试很简单,它们是一个八度和键的映射。
(spec/def ::octave (spec/int-in 0 9))
(spec/def ::key (spec/int-in 0 12))
(spec/def ::note (spec/keys :req-un [::octave ::key]))
现在的问题是,如果八度为零,只有A、A#和B是有效的键。如果八度为8,只有C是有效的键。
这实际上是重要的,因为如果不将钢琴键转换为键盘上的数字,将会得到无效的值,如-8或96。
我的问题是,是否有简单的方法来指定根据映射中的一个值,另一个键只允许特定的值?这似乎是一个足够常见的问题。或者我犯了基本的错误?