Подтвердить что ты не робот

Устранение хвостового звонка в 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 вместе и разрешать запуск кода неограниченно без сбоев?

4b9b3361

Ответ 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 часов, а использование памяти плоское.