Function Clojure中的自动TCO

Function Clojure中的自动TCO,function,clojure,automation,tail-recursion,tail-call-optimization,Function,Clojure,Automation,Tail Recursion,Tail Call Optimization,有没有办法在Clojure中定义一个自动优化尾部调用的函数 e、 g 将在内部转换为以下内容: (defn fact [x] (loop [n x f 1] (if (= n 1) f (recur (dec n) (* f n))))) 你能告诉我这样的事情是否已经存在吗?简短的回答是“没有” 稍长一点的回答是,Clojure被故意设计为需要明确指示尾调用优化的位置,因为JVM本机不支持它 顺便说一句,您可以使用recu

有没有办法在Clojure中定义一个自动优化尾部调用的函数

e、 g

将在内部转换为以下内容:

(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))))
更新,4月29日:

克里斯·弗里斯(Chris Frisz)一直在与丹·弗里德曼(Dan Friedman)合作一个研究项目,虽然目前没有人声称这是“答案”,但该项目既有趣又有希望。克里斯最近就这个项目做了一次非正式的演讲,简短的回答是“不”

稍长一点的回答是,Clojure被故意设计为需要明确指示尾调用优化的位置,因为JVM本机不支持它

顺便说一句,您可以使用
recur
而不使用
loop
,因此无需再键入,例如:

(defn func [x]
  (if (= x 1000000)
    x
    (recur (inc x))))
更新,4月29日:


克里斯·弗里斯(Chris Frisz)一直在与丹·弗里德曼(Dan Friedman)合作一个研究项目,虽然目前没有人声称这是“答案”,但该项目既有趣又有希望。Chris最近就这个项目做了一次非正式的演讲,据我所知,Clojure中没有自动生成尾部递归的方法

有些函数使用递归而不使用循环。。在不溢出堆栈的情况下重复该工作。这是因为这些函数都是精心编写的,以使用惰性序列

下面是一个用手写函数替换“展平”的示例。这个例子来自


就我所知,在Clojure中没有自动生成尾部递归的方法

有些函数使用递归而不使用循环。。在不溢出堆栈的情况下重复该工作。这是因为这些函数都是精心编写的,以使用惰性序列

下面是一个用手写函数替换“展平”的示例。这个例子来自


这一决定背后的指导原则之一是使特殊部分看起来特别。这样,很明显尾部调用在哪里使用,在哪里不使用。这是一个经过深思熟虑的设计决定,一些人对此有强烈的意见,尽管在实践中我很少看到idomatic Clojure中再次使用,所以在实践中这不是一个常见的问题

这一决定背后的指导原则之一是让特殊部分看起来特别。这样,很明显尾部调用在哪里使用,在哪里不使用。这是一个经过深思熟虑的设计决定,一些人对此有强烈的意见,尽管在实践中我很少看到idomatic Clojure中再次使用,所以在实践中这不是一个常见的问题

谢谢你,我知道没有内置的函数可以做到这一点,我想可能有一些社区函数/宏可以做到这一点。我还知道可以使用无循环的递归。但是遗憾的是,仅仅用recur替换递归调用并不能奏效。谢谢你,我知道没有内置函数可以做到这一点,我想可能有一些社区函数/宏可以做到这一点。我还知道可以使用无循环的递归。但遗憾的是,仅仅用recur替换递归调用并不能奏效。另一个不同(但仍然相关)的问题可能是,“有没有一种自动的方法可以将递归函数转换为使用
recur
”的函数?”如果没有,这是否证明是不可能的?我认为这也足以满足我的目的。为了说明我为什么需要它,知道我仍在致力于在Clojure中实现可能对我很重要。Shen自动执行TCO。刚才看到这让我想起了这个问题。不知道你是否见过它。另一个不同(但仍然相关)的问题可能是,“有没有一种自动化的方法可以将递归函数转换为使用
递归
的函数?”如果没有,这是否证明是不可能的?我想这也足以满足我的目的。为了说明我为什么需要它,知道我仍在致力于在Clojure中实现可能对我很重要。Shen自动执行TCO。刚才看到这让我想起了这个问题。不知道你是否看过。
(fn flt [coll]
  (let [l (first coll) r (next coll)]
    (concat 
      (if (sequential? l)
        (flt l)
        [l])
      (when (sequential? r)
        (flt r)))))