2010-02-02 24 views
17

Birisi bu (plt) Şema kodunu Clojure'a yeniden yazabilir mi? birlikte prosedürler f, g, ve h çökmediği ve kod çökmesini süresiz çalışmasına izin vermek gibi bir yollaClojure'da Kuyruk Çağrısı Eliminasyonu?

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

?

cevap

30

kullanın trambolin: ile

(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 kapalı: Şimdi yaklaşık 5 saat boyunca arka planda benim pc üzerinde çalışan bu kodu yaşadım

(trampoline f 0) 

ve bellek kullanımı olduğunu düz.