2011-12-30 13 views
7

Así que quiero ejecutar primero un montón de código, y luego preguntar al usuario si quiere hacer eso de nuevo. Me pareció la forma más conveniente de hacer esto sería un do-while como en C++, y ya que no podía encontrar ninguna función do-while en Clojure, me escribió lo siguiente:Do-while loop en Clojure?

(defmacro do-while 
    "Executes body before testing for truth expression" 
    [test & body] 
    `(do (do [email protected]) (while ~test [email protected]))) 

Would Hay una forma mejor (como en Clojure-ish más idiomática) de escribir esta macro, o quizás una mejor manera de hacer lo que quiero sin pasar por la ruta do-while?

Respuesta

14

Aquí es una versión ligeramente modificada del Clojure's while macro, donde el examen se realiza después de evaluar el cuerpo:

(defmacro do-while 
    [test & body] 
    `(loop [] 
    [email protected] 
    (when ~test 
     (recur))))