开发者

Tail Call Elimination in Clojure?

开发者 https://www.devze.com 2022-12-18 14:28 出处:网络
Can somebody rewrite this (plt) Scheme code into Clojure? (define (f n) (printf \"(f ~a)~n\" n) (g n)) (define (g n)

Can somebody rewrite this (plt) Scheme code into 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)))

In such a way as to not collapse the procedures f, g, and h together and to allow the code开发者_StackOverflow to run indefinitely without crashing?


Use a 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))

Kick it off with:

(trampoline f 0)

I've had this code running on my pc in the background for about 5 hours now and the memory usage is flat.

0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号