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 это возвращает бесконечную последовательность. Ленивая последовательность будет немного медленнее, чем жесткая петля, но также позволяет управлять контуром.