Clojure:基于条件重现值的惯用法

Dav*_*ams 4 clojure

由于recur只能用于尾部位置,我如何使用依赖于嵌套条件的值重复?这是一个例子:

(loop [a (rand-int) b 0]
    (if (< a 300)
       (recur (rand-int) 1))
    (if (a < 10000)
       (recur (rand-int) 5))
    b)
Run Code Online (Sandbox Code Playgroud)

问题是在尾部位置不会发生重复.那么我如何循环一个取决于内部条件的新值.我可以做一个参考并在条件中交换它,然后在尾部位置重复,但是有没有办法在没有值变异的情况下做到这一点?

Dan*_*ero 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)))
Run Code Online (Sandbox Code Playgroud)

或者可能更具可读性:

(loop [a (rand-int 20000) b 0]
  (cond 
    (< a 300)   (recur (rand-int 20000) 1)
    (< a 10000) (recur (rand-int 20000) 5)
    :default    b))
Run Code Online (Sandbox Code Playgroud)