Passing parameters in a recursive procedure

"Christophe Chenon" <[email protected]> Sun, 3 Oct 2004 21:12:55 +0200
Newsgroups gmane.text.xml.o-xml
Message-ID <00d001c4a97d$f6cea340$982fe4d5@F037092>
Hi Martin, 

I've just started to play with o:xml and I love it already...

I have a question related to the fact that parameters are passed by reference. 

The following procedure is recursive : it converts a decimal number into another base (lower than 10 in that simple example). 

I cannot think of a way to keep the value of the $number parameter after the recursive call : 

<o:procedure name='base_p'>
  <o:param name='number' type='Number'/>
  <o:param name='base' type='Number' select='2'/>
  <o:do>
   <o:choose>
    <o:when test='$number+1>$base'>
     <base_p number='($number - ($number mod $base)) div $base' base='$base'/>
     <o:eval select='$number mod $base'/>  <!-- Here, the value of $number has changed -->
    </o:when>
    <o:otherwise><o:eval select='$number'/></o:otherwise>
   </o:choose>
  </o:do>
 </o:procedure>
 Result : <base_p number='12938' base='8'/> <!-- The result is not the one expected -->

The following is basically the same procedure, where the parameter is not changed. But the result is "reversed", which is not quite satisfactory :-)


<o:procedure name='base_p2'>
  <o:param name='number' type='Number'/>
  <o:param name='base' type='Number' select='2'/>
  <o:do>
   <o:choose>
    <o:when test='$number+1>$base'>
     <o:eval select='$number mod $base'/> <!-- Here, the value of $number has not changed yet -->
     <base_p2 number='($number - ($number mod $base)) div $base' base='$base'/>
    </o:when>
    <o:otherwise><o:eval select='$number'/></o:otherwise>
   </o:choose>
  </o:do>
 </o:procedure>
 Result : <base_p2 number='12938' base='8'/> <!-- Expected result, to be read from the right to the left... -->

I tried to deep-copy the parameter, to no effect : the value is changed after the recursive call, as can be expected. 

My question : can I declare the parameter in such a way that its value is kept after a call to a function that will use the same parameter name, which is obviously the case of a recursive call ?

This is the same routine as a function which works as expected, the parameters being evaluated before the call to the function.

<o:function name='base_f'>
  <o:param name='number' type='Number'/>
  <o:param name='base' type='Number' select='2'/>
  <o:do>
   <o:choose>
    <o:when test='$number+1>$base'>
     <o:return select='concat(base_f(($number - ($number mod $base)) div $base,$base),($number mod $base).string())'/>
    </o:when>
    <o:otherwise><o:return select='$number.string()'/></o:otherwise>
   </o:choose>
  </o:do>
 </o:function>
 Result : <o:eval select='base_f(12938,8)'/> <!-- Expected value -->

_______________________________________________
o-xml mailing list
o-xml-zRfLyl9bSvv/[email protected]
http://lists.pingdynasty.com/mailman/listinfo/o-xml