Устранение Хвоста в Clojure? - PullRequest
       36

Устранение Хвоста в Clojure?

17 голосов
/ 02 февраля 2010

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

1 Ответ

30 голосов
/ 02 февраля 2010

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...