2010-02-02 7 views
17

Kann jemand diesen (plt) Scheme-Code in Clojure umschreiben?Tail Call Beseitigung 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 einer solchen Art und Weise, um nicht die Verfahren f kollabieren, g und h zusammen und der Code zu ermöglichen, auf unbestimmte Zeit zu laufen, ohne abzustürzen?

Antwort

30

Verwenden Sie ein Trampolin:

(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)) 

Kick it mit off:

(trampoline f 0) 

Ich hatte diesen Code läuft auf meinem PC im Hintergrund für etwa 5 Stunden jetzt und die Speicherauslastung ist eben.