有没有办法在 Clojure 中定义自动尾部调用优化的函数?
e.g.
(defrecur fact [x]
(if (= x 1)
1
(* x (fact (dec x)))))
将在内部翻译为:
(defn fact [x]
(loop [n x f 1]
(if (= n 1)
f
(recur (dec n) (* f n)))))
你能告诉我这样的东西是否已经存在吗?
最简洁的答案是不”。
稍微长一点的答案是,Clojure 被故意设计为要求明确指示需要尾部调用优化的位置,因为 JVM 本身并不支持它。
顺便说一下,你可以使用recur
没有loop
,因此无需再输入内容,例如:
(defn func [x]
(if (= x 1000000)
x
(recur (inc x))))
Update,4 月 29 日:
克里斯·弗里斯 (Chris Frisz) 一直致力于Clojure 总拥有成本 https://github.com/cjfrisz/clojure-tco丹·弗里德曼(Dan Friedman)的研究项目,虽然目前没有人声称它是“答案”,但该项目既有趣又充满希望。克里斯最近就这个项目进行了一次非正式的演讲,并且他已将其发布在他的博客上 http://www.chrisfrisz.com/blog/?p=220.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)