2009-10-03 8 views
14

¿Cuál es la forma idiomática de crear un ciclo infinito?Clojure infinite loop


while(true){ 
    calc(); 
} 

Quiero llamar a la función calc para siempre. Solo se llama una función una y otra vez.

EDITAR: Otra cosa que olvidé mencionar es que calc tiene efectos secundarios. Hace algunos cálculos y modifica una matriz de bytes.

Respuesta

23

while está en las bibliotecas del núcleo.

(while true (calc)) 

Esto se amplía a un simple 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

Parece que (while (calc) nil) sería más útil. – Kzqai

12

(bucle [] (calc) (reaparecer))

+0

Esta es la sintaxis para la recursión de cola simple que no pude recordar inmediatamente. –

16

El uso de la macro while que Brian proporciona en su respuesta es una tarea sencilla para escribir una macro forever que no hace más que gotas de la prueba booleana de while:

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

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

Esta es la parte divertida de cualquier Lisp, puede hacer sus propias estructuras de control y, a cambio, evitará un montón de boilerplate code.

+0

Con el tiempo, sería inútil escribir una macro para siempre que haga exactamente lo mismo. A menos que quisiera una aclaración sobre el nombre, y en ese caso, ¡quizás alguien debería escribir una macro de sinónimos de funciones! : p – Rayne

+2

No estoy de acuerdo. ¿Consideras 'dosync' inútil? También podría escribir (sincronizar nada ...). – Jonas

2

Otra solución sería utilizar repeatedly como:

(repeatedly calc) 

En lugar de un bucle infinte, esto devuelve una secuencia infinita. La secuencia floja será un poco más lenta que un ciclo cerrado, pero también permite cierto control del ciclo.

+1

esto producirá una secuencia floja como usted dijo, por lo que los efectos secundarios podrían no ser ejecutados. entonces la respuesta debería incluir 'doall' –