2013-01-13 59 views
0

如何在clojure中进行一些处理后,从函数返回值。在Java中处理后从函数返回值

private int add() { 

int i = 0; 

if (i == 0) i++; 
if (i == 1) i += 2; 
else i += 3; 

} 

代码,我想用我们的,但有太多的if语句,因此我不确定如何退还。

+1

你不需要3个IFS为那。你可以这样做:'i + =(i <= 1)?我+ 1:3;' – jeremy

+0

@Nile我正在谈论这个代码在clojue – aceminer

+0

@尼尔,看起来不正确的我。应该更像'i + =(i <= 1)? 3-i:3;(当然,这两个都忽略了负数的可能性)。 – amalloy

回答

0

最简单的音译是仅仅命名新的当地人的i每个新值,就像这样:

(defn add [] 
    (let [i 0 
     i' (if (= i 0) (inc i) i) 
     i'' (if (= i' 1) 
       (+ 2 i') 
       (+ 3 i'))] 
    i'')) 

所有这些本地人可能被命名为i,而不是要求他们i',但我没有”我们不希望混淆不变性问题:我们不以任何方式修改i,只是引入一个新的命名本地绑定到一个新的值。

0

代码的模式是:

if-else-expr(init-value) -> value1 
if-else-expr(value1) -> value2 
if-else-expr(value2) -> value3 
if-else-expr... 

它可以用Clojure实现为

(defn add [] 
    (-> init-value 
     (#(if (expr1-1) (expr1-2) (expr1-3))) 
     (#(if (expr2-1) (expr2-2) (expr2-3))) 
     (#(if (expr3-1) (expr3-2) (expr3-3))) 
     ...)) 

你的情况:

(defn add [] 
    (-> 0 
     (#(if (= % 0) (+ % 1) %)) 
     (#(if (= % 1) (+ % 2) (+ % 3))))) 
+0

这两种方法都与发布的java有所不同,后者依赖于应用了零的情况*,然后*测试了一个。即如果输入为零,那么它会增加,然后检查它是否是一个。如果您试图将这一切都纳入单一检查,您不会继承代码的实际含义。 – amalloy

+0

@amalloy谢谢。你是绝对正确的。我已经改变了答案。 – mobyte