java - 字段方法在带有多个子 block 的 let 中不起作用

标签 java clojure

这段java代码是我从网上得到的

import java.util.zip.CRC32;

public static short getCRC(String s, int i, byte bytes[])
{
      CRC32 crc32 = new CRC32();
      if (s != null)
      {
          for (int j = 0; j < s.length(); j++)
          {
              char c = s.charAt(j);
              crc32.update(c);
          }
      }
      crc32.update(i);
      crc32.update(i >> 8);
      crc32.update(i >> 16);
      crc32.update(i >> 24);
      for (int k = 0; k < bytes.length; k++)
      {
          byte byte0 = bytes[k];
          crc32.update(byte0);
      }
      return (short) (int) crc32.getValue();
}

我尝试将其翻译为 Clojure:

(defn getCRC [s i bytes]
    (let [crc32 (CRC32.)]
        (if (not= s nil)
            (for [c s] (.update crc32 (int c)))
        )
        (map #(.update crc32 (int (bit-shift-right i %))) [0 8 16 24])
        (for [c bytes]
            (.update crc32 (int c))
        )
        (.getValue crc32)
    )
)

但似乎 .update 不起作用并且函数返回 0。
我评估了 let 主体中的每个 block ,它工作正常。
我还在 .getValue 之前放置了另一个带有数字的 .update ,它工作正常,函数的返回值变成了它的 CRC32;
但是当我将它们捆绑在一起时,返回值再次变为 0。

非常感谢任何帮助或想法!

最佳答案

问题在于 formap产生惰性序列。

由于您没有在代码中的任何位置强制执行它们的结果,因此不会实现序列,并且永远不会调用 .update

尝试将两者都替换为 doseq - 专门处理副作用(除其他外并不懒惰)的迭代形式,并查看它如何改变结果:

(defn getCRC [s i bytes]
    (let [crc32 (CRC32.)]
        (if (not= s nil)
            (doseq [c s] (.update crc32 (int c)))
        )
        (doseq [x [0 8 16 24]] (.update crc32 (int (bit-shift-right i x))))
        (doseq [c bytes]
            (.update crc32 (int c))
        )
        (.getValue crc32)
    )
)

关于java - 字段方法在带有多个子 block 的 let 中不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25936272/

相关文章:

java - 我的数组元素在 Java 中具有相同的 id?

frameworks - 面向设计师/前端开发人员的 Clojure Web 框架

Android 对动态语言不利

haskell - 如何在使用惰性序列时观察进度?

java - XMLGregorianCalendar 到 DateTime Java

Java JUnit 测试未通过

java - 多个 JAX RS 路径触发错误的方法

java - 从外部类访问 JFrame 中的组件

clojure - lein-autodoc 与 Leiningen 2

clojure - 从 Clojure 应用程序转换到最新的 Clojure 时遇到问题