将Java概念转换为Clojure

Hak*_*kan 2 java clojure

我对Clojure很新.我有一个Java方法,包括一个布尔变量,我想重写这个方法,以便在Clojure中使用相同的功能.但我无法在Clojure中找到如何在运行时设置布尔值true和false.

下面的代码片段基本上只强调布尔部分.我很难想到以函数的方式编写它.

int calculate(...){
  int y = 0;
  boolean flag = false;
  foreach(...){
     if(!flag){
        y = 1;
        flag = true;
     }
     else{
        y = -1;
        flag = false;
     }
  }
  return y;
} 
Run Code Online (Sandbox Code Playgroud)

这是我在Clojure的第一次尝试:

(defn calculate [...]
    ( ??flag?? -> I do not know which macro I should use over here
      (doseq [x ...]
        (if (false? flag) (do 1 (set the flag true)) 
           (do -1 (set the flag false)))))
Run Code Online (Sandbox Code Playgroud)

如何在Clojure中实现相同的概念?

Nat*_*hes 7

对于您拥有的Java代码,将其转换为Clojure的最简单方法是跳过所有迭代并返回最终值:

(defn calculate [coll]
  (odd? (count coll)))
Run Code Online (Sandbox Code Playgroud)

如果你想要更精细的东西,我想你可以做点什么

(defn calc [coll flag]
  (if (empty? coll)
    flag
    (recur (rest coll) (not flag))))
Run Code Online (Sandbox Code Playgroud)

并称之为

(defn calculate [coll]
  (calc coll false))     
Run Code Online (Sandbox Code Playgroud)

这种递归并不是最惯用的风格,对于这个问题它有点疯狂,但它演示了如何改变变量而不是变量,而是编写一个表达式,当求值时会产生传递给下一次迭代的值(参见recur call in上面的例子).

重写这样的风格会更好

(defn calculate
  ([coll flag]
    (if (empty? coll)
      flag
      (recur (rest coll) (not flag))))
  ([coll]
    (calculate coll false)))
Run Code Online (Sandbox Code Playgroud)

所以只有一个功能名称要处理.(我离开了另一个方向,认为对于Clojure的新人来说可能会更清楚.)

我的第二条评论建议你看看4clojure.这是一种很好的练习方式,一旦你有了解决方案,你就可以从其他用户那里学到东西.