Lein 检查:case 有 int 测试,但测试的表达式不是原始的

Car*_*ate 3 clojure switch-statement

我正在编写标准的高/低猜谜游戏,但带有“AI”(尽管这是一个慷慨的术语)。

下面的函数取一个数字范围内的最低和最高数字、先前的猜测和“方向”,该“方向”表示先前的猜测是否太低、太高或正确,并返回新的数字范围猜测。

(defn new-range [min-n max-n guess direction]
  (case direction
    1 [min-n guess]
    -1 [guess max-n]
    0 [guess guess]))
Run Code Online (Sandbox Code Playgroud)

当我通过 运行这个函数时lein check,它给了我一个错误/警告:

case has int tests, but tested expression is not primitive.
Run Code Online (Sandbox Code Playgroud)

并指向(case direction。

这是什么意思?我搜索了它,但我能找到的只是对定义此错误的源的引用。

这是我应该担心的吗?我尝试了 type-annotating direction,但这并没有改变任何东西。

编辑:事实证明,当我尝试注释时direction,我不小心使用了 boxed-type Long。哎呀。

Ale*_*ler 5

1、-1 和 0 将是原始 long。check 告诉您 arg 方向不是原始 long (可能是 Long 对象)。

类型提示方向 arg 应该修复它:

(defn new-range [min-n max-n guess ^long direction]
  (case direction
    1 [min-n guess]
    -1 [guess max-n]
    0 [guess guess]))
Run Code Online (Sandbox Code Playgroud)

或者(long direction)在这种情况下将方向转换为 long with应该可以:

(defn new-range [min-n max-n guess direction]
  (case (long direction)
    1 [min-n guess]
    -1 [guess max-n]
    0 [guess guess]))
Run Code Online (Sandbox Code Playgroud)

我不认为这些行为会因任何这些行为而有所不同,它只会对性能略有帮助。