2009-12-09 5 views
0

Обычно, мы имеем ситуацию, как это в C++Как перевести этот кусок императивного кода в Clojure кода

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

Как я могу сделать выше, в Clojure без использования рефов, потому что я не могу назначить после инициализации?

Спасибо.

ответ

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 (and (some_condition_satisfied g) (not= 0 (eval g))) 
    (do_something)) 

Это будет соответствовать код C++ для

if (some_condition_satisfied(g) && 0 != eval(g)){ 
    do_something(); 
} 

Кроме того, мой Clojure ржавый, но я уверен, что я проверил синтаксис.

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, но вместо нее.

Ball: вы забыли о части if (a! = 0).

+0

я считаю, что. В комментарии говорится, что eval (g) никогда не возвращает ноль. Единственные случаи, когда второй, если бы этот блок был пропущен, - это если либо комментарий лежит (возможно, возможно, даже вероятен), либо some_condition_satisfied (g) терпит неудачу, а предыдущий блок if не присваивает a. Поэтому я почувствовал, что они могут присоединиться. – Ball

1

Предполагая some_condition_satisfied предикат, your-eval-fn никогда не возвращает ложь, а значение а требуется, вы можете написать:

(if-let [a (and (some-condition-satisfied? g) 
       (your-eval-fn g))] 
    (do-something a)) 
Смежные вопросы