clojure scheme tail-recursion tail-call-optimization

¿Eliminación de llamadas de cola en Clojure?



scheme tail-recursion (1)

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

Comience con:

(trampoline f 0)

He tenido este código ejecutándose en mi PC en segundo plano durante aproximadamente 5 horas y el uso de la memoria es simple.

¿Alguien puede reescribir este código de Esquema (plt) 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 tal manera que no colapsen los procedimientos f, g y h juntos y permitan que el código se ejecute indefinidamente sin fallar?