2010-02-02 11 views
17

¿Alguien puede reescribir este (plt) código Scheme en Clojure?Eliminación de llamadas de cola en 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))) 

De una manera tal como para no colapsar el procedimientos de f, g, y h juntos y para permitir que el código se ejecute de forma indefinida sin que se caiga?

Respuesta

30

Usar un trampolín:

(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 apagado con:

(trampoline f 0) 

He tenido este código que se ejecuta en mi pc en el fondo durante aproximadamente 5 horas ahora y el uso de memoria es plano.

Cuestiones relacionadas