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

标签 recursion 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 是一个节拍器实例;踢脚和 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/

相关文章:

clojure - 如何通过 Light Table IDE 连接 Overtone

c++ - 返回排序数组中重复数字计数的函数

scala - Scala REPL中的递归重载语义-JVM语言

Clojure 盒 : Problem with classpath (noob question)

exception-handling - 如何处理 let 绑定(bind)或正文中发生的异常

clojure - midicps 如何在泛音中工作?

algorithm - N-皇后拼图解决方案 - 无法理解

unix - Ant 的递归 chmod 能否在速度上与 exec 竞争?

clojure - 为什么 Leiningen 会陷入顶层空洞的 future ?