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。哎呀。
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)
我不认为这些行为会因任何这些行为而有所不同,它只会对性能略有帮助。