I'm very confused by this. The function body contains two recursive calls. The one inside the typeswitch is certainly not tail-recursive, so you're going to get recursion depth equal to the maximum tree depth. The other call, as far as I can see, merely returns its second argument unchanged, which seems totally pointless.
Michael Kay Saxonica > On 15 Sep 2017, at 09:30, Kendall Shaw <ks...@kendallshaw.com> wrote: > > I don't remember seeing an xquery function that tries to return it's input > unchanged. > > Can this be improved: > > declare function local:id($e as element()?, $acc as element()?) as element() { > if (empty($e)) then > $acc > else > local:id(() > , element {node-name($e)} { > $e/@* > , for $node in $e/node() > return typeswitch($node) > case element() return local:id($node, $acc) > default return $node > }) > }; > > The idea is that functions that do more than return their input could be > based on the function, and benefit from tail call optimization. > > Kendall > > > _______________________________________________ > talk@x-query.com > http://x-query.com/mailman/listinfo/talk _______________________________________________ talk@x-query.com http://x-query.com/mailman/listinfo/talk