clojure - Lein 检查 : case has int tests, 但测试的表达式不是原始的

标签 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]))

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

case has int tests, but tested expression is not primitive.

并指向(大小写方向

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

这是我应该担心的事情吗?我尝试了类型注释 direction,但这并没有改变任何东西。

编辑:事实证明,当我尝试注释 direction 时,我不小心使用了盒装类型的 Long。哎呀。

最佳答案

1、-1 和 0 将是原始长整型。 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]))

或者在这种情况下使用 (long direction) 将方向转换到 long 应该有效:

(defn new-range [min-n max-n guess direction]
  (case (long direction)
    1 [min-n guess]
    -1 [guess max-n]
    0 [guess guess]))

我不认为这些行为会有所不同,它只会稍微提高性能。

关于clojure - Lein 检查 : case has int tests, 但测试的表达式不是原始的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40388148/

相关文章:

emacs - Cider 有像 Cursive(IntelliJ IDEA) 那样的实时模板吗?

clojure - 从 REPL 中调用黑色页面

clojure - korma 的选择字段功能不拒绝列?

javascript - 使用 jQuery 切换多组元素的顺序

c - 初学者,带源代码的 C 语言 switch 中的字符串。可能的?

swift - 值为 Int 但 case 可以包含数组的 Switch 语句

node.js - Clojurescript + Node.js 0.12.7 问题(错误 "process.binding(' evals')没有这样的模块 : evals")

clojure - 当结账依赖项发生变化时,如何让Figwheel重新加载网站?

java - Switch 语句未正确执行

java - 如何使用 switch 语句为不同的输入类型创建通用方法