2010-02-02 88 views
17

有人可以將這個(plt)Scheme代碼改寫成Clojure嗎?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))) 

在這樣一種方式,以不折疊程序F,G,和h在一起並且允許代碼沒有崩潰無限期運行?

回答

30

使用蹦牀:

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

進行強制其關閉:

(trampoline f 0) 

我有這個代碼,現在我在後臺pc上運行約5小時,並在內存利用率平面。