Clojure бесконечный цикл - PullRequest
17 голосов
/ 04 октября 2009

Что такое идиоматический способ создания бесконечного цикла?


while(true){
   calc();
}

Я хочу вызывать функцию calc навсегда. Только одна функция вызывается снова и снова.

EDIT: Еще одна вещь, которую я забыл упомянуть, это то, что у calc есть побочные эффекты. Он выполняет некоторые вычисления и модифицирует байтовый массив.

Ответы [ 4 ]

25 голосов
/ 04 октября 2009

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
       ~@body
       (recur))))
16 голосов
/ 04 октября 2009

Используя макрос while, который Брайан предоставляет в своем ответе, очень просто написать макрос forever, который ничего не делает, но отбрасывает логический тест с while:

(defmacro forever [& body] 
  `(while true ~@body))

user=> (forever (print "hi "))                         
hi hi hi hi hi hi hi hi hi hi hi ....

Это забавная часть любого Лиспа, вы можете создавать свои собственные управляющие структуры, а взамен вы избегаете большого количества стандартного кода .

12 голосов
/ 04 октября 2009

(цикл [] (Расч) (Рецидивировать))

3 голосов
/ 08 июля 2013

Другое решение было бы использовать repeatedly, например:

(repeatedly calc)

Вместо бесконечного цикла возвращается бесконечная последовательность. Ленивая последовательность будет немного медленнее, чем жесткая петля, но также позволяет некоторый контроль над петлей.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...