Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
是否帮助将此Java代码块翻译为Clojure?_Java_Functional Programming_Clojure - Fatal编程技术网

是否帮助将此Java代码块翻译为Clojure?

是否帮助将此Java代码块翻译为Clojure?,java,functional-programming,clojure,Java,Functional Programming,Clojure,我已经习惯了函数式编程 我一直在将其他语言中的各种命令式函数翻译成它们的Clojure等价物——到目前为止,一切都进展顺利。然而,我现在遇到了一个关键点,我不知道如何将这个Java方法翻译成惯用的Clojure 起初,“地图”似乎是一个正确的工具,但玩了一点之后,我不太确定。有人能告诉我如何用Clojure编写这个函数吗 谢谢 public String calculateChecksum(String str) { String hash = "bjytk3lfj%3jklDskj";

我已经习惯了函数式编程

我一直在将其他语言中的各种命令式函数翻译成它们的Clojure等价物——到目前为止,一切都进展顺利。然而,我现在遇到了一个关键点,我不知道如何将这个Java方法翻译成惯用的Clojure

起初,“地图”似乎是一个正确的工具,但玩了一点之后,我不太确定。有人能告诉我如何用Clojure编写这个函数吗

谢谢

public String calculateChecksum(String str)
{
    String hash = "bjytk3lfj%3jklDskj";
    int key = 1690912;

    for(int i=0; i < str.length(); i++) {

        key = key ^ (int)(hash.charAt(i%hash.length()))^(int)(str.charAt(i));
        key = key>>>23|key<<9;

    }return "8"+toHex8(key>>>(8&255))+toHex8(key&255);

}
publicstringcalculatechecksum(stringstr)
{
String hash=“bjytk3lfj%3jklDskj”;
int键=1690912;
对于(int i=0;i>>23 |键>(8和255))+toHex8(键和255);
}

Clojure不暴露>>>操作符,因此无法直接翻译。

我们刚刚经过Hallow'een,现在是…活生生的n00bs之夜!

我只做了几天的Clojure编程。这项工作更接近“真正的”Clojure,至少它可以编译。它也会产生一个结果,但可能不是正确的结果。接下来还有:

(ns erikcw)

(defn toHex8 [n] (format "%08x" n))        ; Just a guess!

                                           ; can't use str, that's predefined.
(defn calculateChecksum [url]               ; I renamed the arg to url so I can use strn later.
  (loop [strn url                          ; this will loop over chars in strn.
         hash (cycle "bjytk3lfj%3jklDskj") ; now hash repeats for as long as you need it.
         key 1690912]                      ; modifying key along the way.
    (prn strn key)                           ; debug print.
    (let [k2 (bit-xor (bit-xor key (int (first hash))) (int (first strn)))
          k3 (bit-or (bit-shift-right k2 23) (bit-shift-left k2 9))]
      (if (empty? (rest strn))
        (str "8" (toHex8 (bit-shift-right k3 8)) (toHex8 (bit-and k3 255)))
        (recur (rest strn) (rest hash) k3)))))

(prn (calculateChecksum "HowNowBrownCow"))
我不知道toHex8函数的功能是什么,所以我写了一个函数,把它的参数打印成8位数的十六进制数。只是为了编译这个该死的东西

我没有使用索引从
散列
strn
中提取字符,而是将这两个字符都视为字符序列,在每次迭代中只处理它们的头元素。
散列
由于
(循环)
而无限长

位操作的名称以“
位-
”开头


因为整数在Clojure中可以任意变大,所以由于
What's url.length()?它应该是str吗?url变量是什么?toHex8做什么?我不知道Clojure,所以我不会写答案,但您需要reduce函数:我想“key>>>(8&255)”是错误的括号。好吧,我承认我在这方面做了一个简单的右移。让我们看看我是否能解决这个问题…啊,太好了…因为我们从一个正数开始,因为它一直在增长,变成一个大整数,它从来都不是正数。所以>>产生了与>>>相同的结果。呸!:)你仍然可以创建一个数学上等价的Clojure中的nt函数这是肯定的:)+1的努力,但哇!如果这真的是我们在Clojure中所能做的最好的,我想知道我们是否发现了Clojure不如Java简洁的一个领域(有点胡闹)。我不反对提议的解决方案。(我肯定做不到更好。)但与我们所提出的相比,Java版本读起来像丝绸一样光滑。好吧,Clojure在需要冗长的函数名方面有点失意,因为Java有简洁的运算符。我很确定真正的Clojure人本可以做得比我更好。首先,我错过了在下一个关键点中进行分解的机会。
(defn next-key [key str-hash]
  (let [str1 (first str-hash)
        hash1 (second str-hash)
        k2 (bit-xor (bit-xor key hash1) str1)]
        (bit-or (bit-shift-right k2 23) (bit-shift-left k2 9))))

(defn calculateChecksum2 [url]
  (let [kk
    (reduce next-key 1690912
      (partition 2                ; (72 98) (111 106) (119 121) ...
        (map int                  ; 72 98 111 106 119 121
          (interleave url (cycle "bjytk3lfj%3jklDskj"))))) ; "HbojwyNt..."
  ]
  (str "8" (toHex8 (bit-shift-right kk 8)) (toHex8 (bit-and kk 255)))))

(prn (calculateChecksum2 "HowNowBrownCow"))