2009-10-03 2 views
14

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


while(true){ 
    calc(); 
} 

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

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

ответ

23

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

Похоже, что (хотя (calc) ноль) было бы более полезно. – Kzqai

12

(цикл [] (расч) (повторяются))

+0

Это синтаксис для простой хвостовой рекурсии, который я не мог сразу вспомнить. –

16

Используя while макрос, который Brian обеспечивает в своем ответе, что это простая задача, чтобы написать 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, вы можете создавать свои собственные структуры управления, а взамен вы избегаете большого количества boilerplate code.

+0

С течением времени было бы бессмысленно писать вечный макрос, который делает то же самое. Если вы не хотите уточнить имя, и в этом случае, возможно, кто-то должен написать макрос синонима функции! : p – Rayne

+2

Я не согласен. Вы считаете «dosync» бессмысленным? Вы могли бы так же написать (sync noil ...). – Jonas

2

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

(repeatedly calc) 

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

+1

это произведет ленивую последовательность, как вы сказали, поэтому побочные эффекты могут не выполняться. поэтому ответ должен включать «doall», –

Смежные вопросы