2009-10-03 13 views
14

Qual è il modo idiomatico per creare un ciclo infinito?Clojure infinito loop


while(true){ 
    calc(); 
} 

Voglio chiamare la funzione di calcolo per sempre. Solo una funzione viene chiamata più e più volte.

MODIFICA: Un'altra cosa che ho dimenticato di menzionare è che il calc ha effetti collaterali. Fa alcuni calcoli e modifica un array di byte.

risposta

23

while è nelle librerie di base.

(while true (calc)) 

Si espande in un semplice 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

Sembra (mentre (calc) nil) sarebbe più utile. – Kzqai

12

(anello [] (calc) (ripresentarsi))

+0

Questa è la sintassi per la semplice ricorsione della coda che non ho potuto richiamare immediatamente alla mente. –

16

Utilizzando la while macro che Brian fornisce nella sua risposta si tratta di un compito semplice per scrivere una macro forever che non fa altro che scende il test booleano da while:

 
(defmacro forever [& body] 
    `(while true [email protected])) 

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

Questa è la parte divertente di qualsiasi Lisp, è possibile creare le proprie strutture di controllo e in cambio si evita molto di boilerplate code.

+0

Con in giro, sarebbe inutile scrivere una macro per sempre che faccia esattamente la stessa cosa. A meno che tu non volessi un chiarimento sul nome, e in quel caso, forse qualcuno dovrebbe scrivere una sinonimo di funzione! : p – Rayne

+2

Non sono d'accordo. Ritiene che 'dosync' sia inutile? Potresti anche scrivere (sincronizzare nil ...). – Jonas

2

Un'altra soluzione sarebbe quella di utilizzare come repeatedly:

(repeatedly calc) 

Piuttosto che un ciclo infinte, restituisce una sequenza infinita. La sequenza pigra sarà un po 'più lenta di un ciclo stretto, ma consente anche un certo controllo del ciclo.

+1

questo produrrà una sequenza lenta come hai detto, quindi gli effetti collaterali potrebbero non essere eseguiti. quindi la risposta dovrebbe includere "doall" –