2010-02-02 8 views
17

Qualcuno può riscrivere questo codice (plt) Scheme in Clojure?Eliminazione chiamata coda in Clojure?

(define (f n) 
    (printf "(f ~a)~n" n) 
    (g n)) 

(define (g n) 
    (printf "(g ~a)~n" n) 
    (h n)) 

(define (h n) 
    (printf "(h ~a)~n" n) 
    (f (+ n 1))) 

In modo da non comprimere il procedure f, g, h ed insieme e consentire il codice per eseguire indefinitamente senza schiantarsi?

risposta

30

Uso un trampolino:

(declare f) 

(defn h [n] 
    (println "(h " n ")") 
    #(f (+ n 1))) 

(defn g [n] 
    (println "(g " n ")") 
    #(h n)) 

(defn f [n] 
    (println "(f " n ")") 
    #(g n)) 

calci fuori con:

(trampoline f 0) 

Ho avuto questo codice in esecuzione sul mio pc in background per circa 5 ore e che l'utilizzo della memoria è piatto.