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

时间:2015-02-15 23:29:10

标签: 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是一个节拍器实例; kick和c-hat播放声音) 如您所见,递归由调用自身的函数处理。除了关于泛音的文章之外,大多数其他Clojure文章都建议不要使用这种类型的递归,并建议使用recur函数以提高效率。所以我的问题是:有没有更好的方法来编写上述功能?

谢谢你,Niall

1 个答案:

答案 0 :(得分:2)

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