如何将这段命令式代码翻译成Clojure代码

时间:2009-12-09 14:43:45

标签: clojure

通常,我们在C ++中有这样的情况

int a=0;
if(some_condition_satisfied(g)) {
   a = eval(g);  // never returns 0
}
if(a!=0) {
  do_something();
}

如何在不使用refs的情况下在Clojure中执行上述操作,因为初始化后我无法分配?

感谢。

3 个答案:

答案 0 :(得分:3)

首先,如果您的评论被认为,您可以将C ++简化为一个块。

那么,让我们先简化C ++,不管吗?

if(some_condition_satisfied(g)) {
  a = eval(g); // never returns zero, right?
               // so we roll the next if block into this one
  do_something();
}

在clojure中,我会尝试

(if (some_condition_satisfied g)
    (let [a (eval g)]
         (do_something)))

注意我正在设置a但不使用它。这是你的意思吗?否则,将其传递给do_something或更改if条件

(if (and (some_condition_satisfied g) (not= 0 (eval g)))
    (do_something))

这将匹配

的C ++代码
if ( some_condition_satisfied(g) && 0 != eval(g) ){
  do_something();
}

另外,我的clojure很生锈,但我很确定我检查了语法。

答案 1 :(得分:2)

试试这个:

(if-let [a (or (and (some-condition-satisfied g) 
                    (your-eval g))
               0)]
    (when (not= a 0)
       (do-something)))

Rembember在clojure中,当用作布尔值时,0为真,不为假,因此在翻译时会丢失一些C语言。我假设某些条件满足的clojure版本不返回0表示false,而是nil。

Ball:你忘记了if(a!= 0)部分。

答案 2 :(得分:1)

假设some_condition_satisfied是谓词,your-eval-fn永远不会返回false,并且a的值是必需的,您也可以写:

(if-let [a (and (some-condition-satisfied? g)
                (your-eval-fn g))]
  (do-something a))