2011-12-30 13 views
7

Quindi voglio prima eseguire una serie di codice e quindi chiedere all'utente se vuole farlo di nuovo. Ho pensato che il modo più conveniente per fare questo sarebbe un do-while come in C++, e dato che non riuscivo a trovare nessuna funzione do-while in Clojure, ho scritto il seguente:Ciclo Do-while in Clojure?

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

Would ci sarà un modo migliore (come in più idiomatico Clojure-ish) di scrivere questa macro, o forse un modo migliore di fare quello che voglio senza passare attraverso il percorso del do-while?

risposta

14

Ecco una versione leggermente modificata di Clojure's while macro, in cui il test viene effettuato dopo aver valutato il corpo:

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