Clojure:Clojure 重复中的 llegalArgumentException - 类型不匹配

标签 clojure

下面是一个循环/递归构造的简化示例,旨在与字节一起使用。

(defn test-lr []
  (loop [last-byte (byte 0)
         bytez (map byte '(1 2 3 4))
         answer '()]
    (if (empty? bytez)
      answer
      (recur (first bytez)
             (rest bytez)
             (cons (bit-or (first bytez last-byte) answer))))))

每当我尝试在 REPL 中编译此代码时,都会收到以下错误。

CompilerException java.lang.IllegalArgumentException: 
recur arg for primitive local: last_byte is not matching primitive,
had: Object, needed: byte, compiling:...

该错误表明 loop 绑定(bind)所期望的内容与对 recur 的调用及其第一个参数提供的内容之间存在类型不匹配。它们似乎都是字节,所以我不明白问题是什么。

user=> (type (byte 0))
java.lang.Byte
user=> (type (first (map byte '(1 2 3))))
java.lang.Byte

最佳答案

我在 Clojure IRC channel 上询问了这个问题,用户 amalloy 和 dbasch 帮助了我。我从那次谈话中得到的理解如下。

问题似乎在于 loop 绑定(bind)中 last-byte 的绑定(bind)是 Java 原语 byte,而 (first bytez) 实际上返回一个 java.lang.Byte,它派生自 java.lang.Object。因此,预期的 byte Java 原语和 java.lang.Byte(派生自 Object)之间存在类型不匹配。在对 recur 的调用中传递:因此出现错误消息。

解决方法是将 recur 参数转换为原语:(byte (first bytez))

另一种选择是使用字节数组并使用aget进行访问。

一般来说,了解您正在使用的类型很重要,并记住基元和装箱类型不一定可以互换。 Clojure 函数似乎也通常(永远?)不返回 Java 原语。

关于Clojure:Clojure 重复中的 llegalArgumentException - 类型不匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26198603/

相关文章:

clojure - Clojure REPL 到底是什么?它背后的技术是什么?

clojure - 是否可以将特定的 JAR 添加到 nrepl 服务器使用的 Clojure 类路径中?

Spring 管理的 Clojure bean

clojure - 为什么在 clojure 中 will (seq #{3 1 22 44}) 会输出 (1 3 44 22) ?

clojure - 如何在 clojure 1.3 中查找 import-static

validation - clojure 的 Schema 中至少存在一个可选键

java - 使异常信息更丰富

clojure:方案的 `set!` 等价于什么

macros - 在 Clojure 中,我们什么时候应该使用 monad 而不是宏,反之亦然?

clojure - 自动刷新/自动重新加载资源