2014-09-23 2 views
4

Так как recur может использоваться только в положении хвоста, как я могу повторить значение, зависящее от вложенных условных выражений? Ниже приведен пример:Clojure: Идиоматический способ повторения со значениями на основе условных выражений

(loop [a (rand-int) b 0] 
    (if (< a 300) 
     (recur (rand-int) 1)) 
    (if (a < 10000) 
     (recur (rand-int) 5)) 
    b) 

Проблема заключается в том, что повторение не происходит в положении хвоста. Итак, как мне зациклировать новое значение, зависящее от внутреннего условного. Я мог бы сделать ссылку и поменять ее в условных выражениях, а затем вернуться в хвостовое положение, но есть ли способ сделать это без значения мутации?

ответ

10

В рецидивирует могут все быть в хвосте позиции:

(loop [a (rand-int 20000) b 0] 
    (if (< a 300) 
     (recur (rand-int 20000) 1) 
     (if (< a 10000) 
     (recur (rand-int 20000) 5) 
     b))) 

Или, возможно, немного более читаемым:

(loop [a (rand-int 20000) b 0] 
    (cond 
    (< a 300) (recur (rand-int 20000) 1) 
    (< a 10000) (recur (rand-int 20000) 5) 
    :default b)) 
Смежные вопросы