Устранение хвостового вызова в Clojure?

Может ли кто-нибудь переписать этот (plt) код схемы в 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 вместе и позволить коду работать бесконечно без сбоев?


person tkf    schedule 02.02.2010    source источник


Ответы (1)


Используйте батут:

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

У меня этот код работает на моем компьютере в фоновом режиме уже около 5 часов, и использование памяти не меняется.

person Nathan Hughes    schedule 02.02.2010