Clojure бесконечный цикл
Что такое идиоматический способ создания бесконечного цикла?
while(true){
calc();
}
Я хочу называть функцию calc навсегда. Только одна функция вызывается снова и снова.
EDIT:
Еще одна вещь, которую я забыл упомянуть, заключается в том, что у calc есть побочные эффекты. Он выполняет некоторые вычисления и изменяет массив байтов.
Ответы
Ответ 1
while
находится в основных библиотеках.
(while true (calc))
Это расширяется до простого recur
.
(defmacro while
"Repeatedly executes body while test expression is true. Presumes
some side-effect will cause test to become false/nil. Returns nil"
[test & body]
`(loop []
(when ~test
[email protected]
(recur))))
Ответ 2
Используя макрос while
, который Брайан дает в своем ответе, простая задача написать макрос forever
, который ничего не делает, кроме как сбросить булевский тест из while
:
(defmacro forever [& body]
`(while true [email protected]))
user=> (forever (print "hi "))
hi hi hi hi hi hi hi hi hi hi hi ....
Это интересная часть любого Lisp, вы можете создавать свои собственные структуры управления, а взамен вы избегаете много шаблонный код.
Ответ 3
(цикл [] (Расч) (RECUR))
Ответ 4
Другим решением было бы использовать repeatedly
как:
(repeatedly calc)
Вместо петли infinte это возвращает бесконечную последовательность. Ленивая последовательность будет немного медленнее, чем жесткая петля, но также позволяет управлять контуром.