关于 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 是一个节拍器实例;踢脚和 c-hat 播放声音) 正如您所看到的,递归是由调用自身的函数处理的。除了有关泛音的文章之外,大多数其他 Clojure 文章都建议不要使用这种类型的递归,并建议使用 recur 函数来提高效率。所以我的问题是:有没有更好的方法来编写上述函数?
谢谢你,尼尔
最佳答案
到目前为止as I can see ,这并不是真正的递归。相反,对 player
函数的求值会产生副作用,导致将来对 #'player
var 中的函数求值被安排。此评估的返回值不依赖于下一个评估,并且每个评估都会在下一个评估开始之前从堆栈中取消假脱机。
因此,实际上并不存在 recur
可能为我们崩溃的 self 调用堆栈。第一个调用之后的每个调用都来自相同的调度程序函数。如果您确实使用了 recur,那么您将无法将 var 重新绑定(bind)到不同的函数以进行实时编码,因此在框架中,这似乎是最通用的编写方式。
关于recursion - 在 clojure/overtone 的递归函数中使用节拍器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28532490/