{{clojure.spec/double-in}} 定义了一种规范,用于测试一个双精度浮点数是否大于或等于最小值,且小于或等于最大值。这在数学和实际应用的视角来看似乎是任意选择。有时您需要测试一个双精度浮点数是否大于最小值或小于最大值。例如:应用程序将在稍后除以检测到的双精度浮点数。
我们当然可以向 {{double-in}} 添加测试,例如:
(s/and (s/double-in :min 0.0 :max 1.0) #(not= 0.0 %))}
但是
`
(and (> % 0.0) (<= % 1))
`
如果不需要 {{double-in}} 的 {{NaN}} 和 {{Infinity}} 测试,则可能更清晰。
为什么不有一个界面可用于所有四个区间测试?与其有四个不同的规范函数,这是一个选择,我建议添加两个关键词到 {{double-in}}。当为 true 时,这些关键词将改变 >= 或 <= 测试为 > 或 < 测试
{{:min-greater}}
(or? :min+, :min-greater-than, :greater-than-min, :strict-min, :min-open, 或可能 :infinmum, :inf,但这可能会产生误导)
{{:max-less}}
(or :max- :max-less-than, :less-than-max, :strict-max, :max-open, 或可能 :supremum, :sup 等.)
例如
(s/valid? (s/double-in :min 0.0 :max 0.1 :min-greater true) 0.0)
将返回 {{false}},但是
(s/valid? (s/double-in :min 0.0 :max 0.1 :min-greater false) 0.0)
将返回 {{true}}。
这些关键词的默认值可能应该是 false,以便与当前 {{double-in}} 的定义保持兼容。