我对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中实现相同的概念?
对于您拥有的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.这是一种很好的练习方式,一旦你有了解决方案,你就可以从其他用户那里学到东西.