2

关于metronomeClojure Overtone 库中的函数,我研究过的所有示例似乎都这样使用它:(示例取自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 播放声音)如您所见,递归由调用自身的函数处理。除了关于泛音的文章外,大多数其他 Clojure 文章都建议不要使用这种类型的递归,并建议使用 recur 函数来提高效率。所以我的问题是:有没有更好的方法来编写上述函数?

谢谢你,尼尔

4

1 回答 1

2

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

于 2015-02-17T08:55:58.310 回答