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

Reply via email to