如何在clojure中优雅地停止重复函数?

如何在clojure中优雅地停止重复函数?,clojure,Clojure,我有一个程序可以播放一小段音乐。我希望它在一个循环中播放一段时间,但我希望能够优雅地停止它,也许可以用按键 (顺便说一句,我尽量避免说“循环”或“按键”,因为我不想把答案引向那个方向。) 我仍然是clojure的初学者,目前我只是从REPL开始运行 是时候让我毕业了,找到一个更好的方式来运行我的音乐功能了吗 我如何告诉我的函数在需要时优雅地停止 这实际上取决于您的实际使用情况:您是想关闭音乐(即在播放时中断音乐),还是只想阻止它下次播放 后一种情况很容易处理,只要你认为应该保持沉默,就可以承诺

我有一个程序可以播放一小段音乐。我希望它在一个循环中播放一段时间,但我希望能够优雅地停止它,也许可以用按键

(顺便说一句,我尽量避免说“循环”或“按键”,因为我不想把答案引向那个方向。)

我仍然是clojure的初学者,目前我只是从REPL开始运行

  • 是时候让我毕业了,找到一个更好的方式来运行我的音乐功能了吗

  • 我如何告诉我的函数在需要时优雅地停止


这实际上取决于您的实际使用情况:您是想关闭音乐(即在播放时中断音乐),还是只想阻止它下次播放

后一种情况很容易处理,只要你认为应该保持沉默,就可以承诺:

(defn play-music! []
  (let [p (promise)]
    (future 
      (while (= (deref p 0 ::timeout) ::timeout)
        ...))
    #(deliver p ::stop)))
这将返回一个可以调用(无参数)以停止循环的函数,例如:

(let [stop-fn (play-music!)]
  ;; ... do important music stuff ...
  (stop-fn))
这将在片段停止播放后停止循环。如果你真的想打断它,你可以使用
future cancel
(但实际结果取决于你的音乐是否真的可以打断):


这也会返回stop函数。重复执行一个操作的方法有很多种,其中大部分都很详细,例如,包括如何停止产生的循环。

这实际上取决于您的实际使用情况:您是想终止音乐(即在播放时中断音乐),还是只想阻止它下次播放

后一种情况很容易处理,只要你认为应该保持沉默,就可以承诺:

(defn play-music! []
  (let [p (promise)]
    (future 
      (while (= (deref p 0 ::timeout) ::timeout)
        ...))
    #(deliver p ::stop)))
这将返回一个可以调用(无参数)以停止循环的函数,例如:

(let [stop-fn (play-music!)]
  ;; ... do important music stuff ...
  (stop-fn))
这将在片段停止播放后停止循环。如果你真的想打断它,你可以使用
future cancel
(但实际结果取决于你的音乐是否真的可以打断):


这也会返回stop函数。重复执行一个操作的方法有很多种,其中大部分都很详细,例如,包括如何停止生成的循环。

xsc的答案很复杂,信息丰富,可能更好,但值得一提的是,一个非常简单的答案可能会起作用:在Leiningen中运行它,然后用Ctrl-C停止函数,我认为它相当优美——虽然不是很优美。

< P> XSC的答案是复杂的、信息丰富的,而且可能更好,但是值得一提的是一个非常简单的答案,它可能会起作用:在Leiningen中运行它,用Ctrl C停止函数。我认为它相当优美——虽然不是很优美。

我相信你会演奏你的音乐A,这样你就可以优雅地停止。我相信你会演奏你的音乐A,这样你就可以优雅地停止。好!我更愿意让当前的“循环”结束,所以我将尝试停止fn!好的我更愿意让当前的“循环”结束,所以我将尝试停止fn!