Clojure中的尾部呼叫消除?

tkf*_*tkf 17 scheme tail-recursion clojure tail-call-optimization

有人可以将此(plt)Scheme代码重写为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)))
Run Code Online (Sandbox Code Playgroud)

以这种方式不会将程序f,g和h一起折叠并允许代码无限期地运行而不会崩溃?

Nat*_*hes 30

使用蹦床:

(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))
Run Code Online (Sandbox Code Playgroud)

踢它:

(trampoline f 0)
Run Code Online (Sandbox Code Playgroud)

我已经在我的电脑上在后台运行了这个代码大约5个小时,内存使用率是平的.