在 clojure/overtone 中的递归函数中使用节拍器

Using a metronome in a recursive function in clojure/overtone

关于 Clojure Overtone 库中的 metronome 函数,我研究过的所有示例似乎都是这样使用它的:(示例取自 https://github.com/overtone/overtone/wiki/Live-coding

(defn player [beat]
  (at (metro beat) (kick))
  (at (metro (+ 0.5 beat)) (c-hat))
  (apply-by (metro (inc beat)) #'player (inc beat) []))

(player (metro))

(上下文:metro 是一个节拍器实例;kick 和 c-hat 播放声音) 如您所见,递归由调用自身的函数处理。除了关于 overtone 的文章外,大多数其他 Clojure 文章都建议不要使用这种类型的递归,并建议使用 recur 函数以获得更高的效率。所以我的问题是:是否有更好的方法来编写上述函数?

谢谢你,尼尔

到目前为止 as I can see,这并不是真正的递归。相反,player 函数的评估会导致,作为副作用,未来对 #'player var 中函数的评估将被安排。此评估的 return 值不依赖于下一个评估,并且每个评估都会在下一个评估开始之前从堆栈中取出。
所以实际上并没有一堆 self 调用 recur 可以为我们崩溃。第一次调用之后的每次调用都来自相同的调度程序函数。如果你确实使用 recur 那么你将失去将 var 重新绑定到不同函数以进行实时编码的能力,因此在框架中这似乎是最通用的编写方式。