[xquery-talk] problem with loops

Michael Kay mhk at mhk.me.uk
Wed Jan 4 09:49:10 PST 2006

> Something as shown below
> ____________________________________
> declare function lcl:caller()
> { 
>        let $QV1 := request:request-parameter("val1","")
>        let $count:= 0
>        let $QV1:= lcl:tracer($QV1)
> for $d in /maps/map
>        let $k:= lcl:rend($QV1)
>        let $QV2:= $QV1
>        let $QV1:= lcl:tracer($k)
>        return $QV2
> };
> ________________________________________

I don't know what your various functions here are doing, but the general
approach to this kind of problem in a functional language is to use
recursion. Your loop here is a bit odd because it doesn't depend on $d, so
you seem to be using /maps/map merely to determine how many iterations there
should be. This suggests a recursive solution along these lines:

declare function f:doit (
    $QV1 as item()*
    $count as xs:integer ) as item()* {
  if ($count eq 0)
  then $QV1
  else f:doit(lcl:tracer(lcl:rend($QV1), $count - 1))

I don't think that's precisely the logic, but it's difficult to reverse
engineer your algorithm from incorrect code.

Michael Kay

More information about the talk mailing list