5 ms·
Maybe someone who knows Scala or Clojure internals can answer this question..
by moondowner 14y ago
Maybe someone who knows Scala or Clojure internals can answer this question..
- fhars 14y agoscala doesn't optimize general tail calls, either (only direct tail recursion of final methods). If you want to optimize tail calls on the JVM, you must use trampolining, which adds some overhead to every call. So most languages choose fast calls without tail call elimination over slower calls with tail call elimination (i.e., speed over correctness).
- happy_dino 14y agoSupport for tail calls pretty much depends on the actual runtime implementation. If it is important to you (it certainly is to me), use an implementation which supports proper tail calls. I'm doing it and I have never looked back.
- cantankerous 14y agoOut of curiosity, which implementation are you using?
- happy_dino 14y agoHave a look at http://oss.readytalk.com/avian/ http://oss.readytalk.com/avian/.
- cantankerous 14y agoThis is very cool. Thank you!
- justinhj 14y agoClojure has a loop/recur construct which makes the tail recursion explicit so doesn't need to be done by the JVM. In other words regular recursive calls should not be used for loops if you want performance.
- riffraff 14y agoI think rail recursion can be handled automatically by the compiler without any support from the jvm (scala does it). The issue is different for general tail call elimination.
- pohl 14y agoScala has a similar explicit @Tailrec annotation for its compiler, too: "A method annotation which verifies that the method will be compiled with tail call optimization. If it is present, the compiler will issue an error if the method cannot be optimized into a loop." http://www.scala-lang.org/api/current/index.html#scala.annotation.tailrec http://www.scala-lang.org/api/current/index.html#scala.annot...
- i_s 14y agoSomeone has made TCO possible in Clojure already: https://github.com/cjfrisz/clojure-tco https://github.com/cjfrisz/clojure-tco
- kvb 14y agoThat's very cool. But note that as far as I can tell it only handles mutual recursion, not arbitrary tail calls (e.g. calls to a function argument).