Вам не нужно do
в вашем цикле; это подразумевается. Кроме того, хотя нет ничего плохого в безусловном циклическом повторении, вы также можете использовать (пока true ...).
future
- прекрасный инструмент для этого; не позволяйте вам беспокоиться о том, что вы никогда не получите значение обратно. Это должно действительно беспокоить вас, если вы используете агента, а не будущее - агенты без ценностей - это безумие.
Однако, кто сказал, что вам нужно future-cancel
? Просто сделайте один из шагов в будущем, чтобы проверить, все ли еще нужно. Тогда никакие другие части вашего кода не должны отслеживать фьючерсы и решать, когда отменить их. Так что-то вроде
(future (loop []
(Thread/sleep 100)
(when (dosync
(alter some-value some-function))
(recur)) ; quit if alter returns nil
))
было бы жизнеспособным подходом.