如何在clojure中优雅地停止重复函数?
我有一个程序可以播放一小段音乐。我希望它在一个循环中播放一段时间,但我希望能够优雅地停止它,也许可以用按键 (顺便说一句,我尽量避免说“循环”或“按键”,因为我不想把答案引向那个方向。) 我仍然是clojure的初学者,目前我只是从REPL开始运行如何在clojure中优雅地停止重复函数?,clojure,Clojure,我有一个程序可以播放一小段音乐。我希望它在一个循环中播放一段时间,但我希望能够优雅地停止它,也许可以用按键 (顺便说一句,我尽量避免说“循环”或“按键”,因为我不想把答案引向那个方向。) 我仍然是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!