<div dir="auto"><div><div class="gmail_quote"><div dir="ltr" class="gmail_attr">J. Gareth Moreton via fpc-devel <<a href="mailto:fpc-devel@lists.freepascal.org">fpc-devel@lists.freepascal.org</a>> schrieb am Di., 13. Dez. 2022, 22:09:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">The next big milestone that I want to achieve is to make this a pure <br>
function:<br>
<br>
procedure int_str_unsigned(l:longword;out s:shortstring); pure;<br>
var<br>
   m1 : longword;<br>
   pcstart,<br>
   pc2start,<br>
   pc,pc2 : pchar;<br>
   hs : string[32];<br>
   overflow : longint;<br>
begin<br>
   pc2start:=@s[1];<br>
   pc2:=pc2start;<br>
   pcstart:=pchar(@hs[0]);<br>
   pc:=pcstart;<br>
   repeat<br>
     inc(pc);<br>
     m1:=l div 10;<br>
     pc^:=char(l-(m1*10)+byte('0'));<br>
     l:=m1;<br>
   until l=0;<br>
   overflow:=(pc-pcstart)-high(s);<br>
   if overflow>0 then<br>
     inc(pcstart,overflow);<br>
   while (pc>pcstart) do<br>
     begin<br>
       pc2^:=pc^;<br>
       inc(pc2);<br>
       dec(pc);<br>
     end;<br>
   s[0]:=char(pc2-pc2start);<br>
end;<br>
<br>
This is essentially the core internal function that drives IntToStr and <br>
similar functions.  The challenges here include:<br>
<br>
- A repeat...until loop with no obvious termination sequence.<br>
- Using a pointer to access an array offset of a local variable.<br>
- Writing characters (and the length field) one at a time to a shortstring.<br>
<br>
The reason for wishing to make IntToStr a pure function is that for a <br>
given input, the output will never change, and it's perfectly feasible <br>
for some other function to call IntToStr as part of a string generation <br>
routine and which would otherwise itself be a pure function (if a pure <br>
function wishes to call another function, it must also be determined to <br>
be pure... see pure1b.pp for the recursive example where the actual <br>
parameter isn't even a constant, but is nonetheless deterministic).<br></blockquote></div></div><div dir="auto"><br></div><div dir="auto">Wouldn't it make more sense to ensure that the Str() and Val() intrinsic work correctly inside "pure" functions? After all the compiler can then simply evaluate the inlinen nodes and does not have to "interpret" a ton of other code as well.</div><div dir="auto"><br></div><div dir="auto">Regards, </div><div dir="auto">Sven </div></div>