请在2024 Clojure 状态调查中分享您的想法!

欢迎!请参阅关于页面,了解更多有关如何使用此关于的信息。

0
规格
重新分类

我的应用程序建模钢琴键,我正试图为它们编写规格。我的初始尝试很简单,它们是一个八度和键的映射。

(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。

我的问题是,是否有简单的方法来指定根据映射中的一个值,另一个键只允许特定的值?这似乎是一个足够常见的问题。或者我犯了基本的错误?

1 个答案

+1

选中
 
最佳答案

我认为一个答案是重新评估数据模型是否正确(可能数字键是起点),但暂时搁置这个问题。

您始终可以添加一个约束允许值的任意谓词函数。

(defn piano-note? [{:keys [octave key]}]
  ...constraints...)
    
(spec/def ::piano-note (s/and ::note piano-note?))

在 s/keys 中无法执行此操作。

...