2010-02-02 26 views
17

Quelqu'un peut-il réécrire ce code de schéma (plt) en Clojure?Élimination d'appel de queue à 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))) 

Dans une telle manière à ne pas réduire la procédure f, g, et h ensemble et pour permettre le code fonctionne indéfiniment sans écraser?

Répondre

30

Utilisez un trampoline:

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

le coup d'envoi avec:

(trampoline f 0) 

J'ai eu ce code en cours d'exécution sur mon pc en arrière-plan pendant environ 5 heures maintenant et l'utilisation de la mémoire est appartement.