通常,我们在C ++中有这样的情况
int a=0;
if(some_condition_satisfied(g)) {
a = eval(g); // never returns 0
}
if(a!=0) {
do_something();
}
如何在不使用refs的情况下在Clojure中执行上述操作,因为初始化后我无法分配?
感谢。
答案 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))