<html>
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  </head>
  <body text="#000000" bgcolor="#FFFFFF">
    <p>Sorry for the mistake in "RoughExp" - the first line is supposed
      to be "Result := 1 + X;", not "Result := Exponent;".<br>
    </p>
    <div class="moz-cite-prefix">On 25/06/2019 06:58, J. Gareth Moreton
      wrote:<br>
    </div>
    <blockquote type="cite"
      cite="mid:bdfb9af7-0aba-ee85-7ba3-41db03228bd7@moreton-family.com">
      <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
      <p>No-one said this would be an easy feature to implement.  This
        might be a step-by-step process, starting with simple function
        calls and building up to complex constant assignment. 
        Nevertheless, at least initially, I would prefer to avoid the
        creation of a pure function that deals with a pointer in any
        way, including objects, since their values or successful
        creation (e.g. out of memory errors or the calling of "Fail")
        cannot be determined at design time.</p>
      <p>Still, looking at your example, there's nothing to say that
        those record methods cannot be made pure, since the records
        already exist by the time they're called.  If anything, that
        looks like a relatively good use case to go on.</p>
      <p>My initial complex use cases (after simple tests) will be the
        following:</p>
      <p><tt><b>function </b>Factorial(N: QWord): QWord; <b>pure</b>;
          <b>inline</b>;</tt><tt><br>
        </tt><b><tt>var</tt></b><tt><br>
        </tt><tt>  X: Integer;</tt><tt><br>
        </tt><b><tt>begin</tt></b><tt><br>
        </tt><tt>  Result := 1;</tt><tt><br>
        </tt><tt>  <b>if </b>N < 2 <b>then</b></tt><tt><br>
        </tt><tt>    Exit;</tt><tt><br>
        </tt><tt><br>
        </tt><tt>  <b>for </b>X := 2 <b>to </b>N <b>do</b></tt><tt><br>
        </tt><tt>    Result := Result * N;</tt><tt><br>
        </tt><tt><b>end</b>;</tt><tt><br>
        </tt><tt><br>
        </tt><tt><b>function </b>RecursiveFactorial(N: QWord): QWord; <b>pure</b>;
          <i>{ Cannot be inlined on account of the recursive call, but
            can be made pure }</i></tt><tt><br>
        </tt><b><tt>begin</tt></b><tt><br>
        </tt><tt>  <b>if </b>N < 2 <b>then</b></tt><tt><br>
        </tt><tt>  <b>begin</b></tt><tt><br>
        </tt><tt>    Result := 1;</tt><tt><br>
        </tt><tt>    Exit;</tt><tt><br>
        </tt><tt>  <b>end</b>;</tt><tt><br>
        </tt><tt><br>
        </tt><tt>  Result := Result * RecursiveFactorial(N - 1);</tt><tt><br>
        </tt><tt><b>end</b>;</tt><tt><br>
        </tt><tt><br>
        </tt><tt><b>function </b>RoughExp(X: Double): Double; <b>pure</b>;</tt><tt><br>
        </tt><b><tt>var</tt></b><tt><br>
        </tt><tt>  Count: Integer;</tt><tt><br>
        </tt><tt>  WorkingValue: Double;</tt><tt><br>
        </tt><b><tt>begin</tt></b><tt><br>
        </tt><tt>  <i>{ Calculate RoughExp(X) as e^X = 1 + X + X^2/2! +
            X^3/3! + ... + X^8/8! }</i></tt><tt><br>
        </tt><tt>  Result := Exponent;</tt><tt><br>
        </tt><tt><br>
        </tt><tt>  <b>for </b>Count := 2 <b>to </b>8 <b>do</b></tt><tt><br>
        </tt><tt>  <b>begin</b></tt><tt><br>
        </tt><tt>    X := X * Exponent; { Contains "X^Count" }</tt><tt><br>
        </tt><tt>    Result := Result + (X / RecursiveFactorial(Count));</tt><tt><br>
        </tt><tt>  <b>end</b>;</tt><tt><br>
        </tt><tt>end;</tt><tt><br>
        </tt><tt><br>
        </tt><tt><b>function </b>Bad(X: QWord): QWord; <b>pure</b>;</tt><tt><br>
        </tt><b><tt>begin</tt></b><tt><br>
        </tt><tt>  Result := 0;</tt><tt><br>
        </tt><tt>  <b>while </b>True <b>do</b></tt><tt><br>
        </tt><tt>    <i>{ Run forever }</i>;</tt><tt><br>
        </tt><tt><b>end</b>;</tt><tt><br>
        </tt><tt><br>
        </tt><b><tt>const</tt></b><tt><br>
        </tt><tt>  Factorial6 = Factorial(6);</tt><tt> <i>{ Should
            convert the function call into the immediate value 720 }</i><br>
        </tt><tt>  Factorial21 = Factorial(21); <i>{ Should return an
            error due to arithmetic overflow }</i></tt><tt><br>
        </tt><tt>  BigNumber = BadCount(0); <i>{ Should return an error
            upon realising it's in an infinite loop }</i></tt><tt><br>
        </tt><tt><br>
        </tt><tt>  RFactorial20: Double = 1 / Factorial(20); <i>{ Typed
            constant }</i></tt><tt><br>
        </tt><tt>  SqrtE = RoughExp(0.5); <i>{ This also tests compiler
            efficiency by remembering past results of RecursiveFactorial
            with identical inputs }</i></tt><tt><br>
        </tt><tt>  ESquared = RoughExp(2); <i>{ ... as does this one if
            a non-recursive factorial is used, due to the previous call
            to RoughExp(0.5) }</i></tt><tt><br>
        </tt></p>
      <p>I may ask you guys for more complex examples down the line. 
        This is something I really want to get working!</p>
      <p>Gareth aka. Kit</p>
      <p>P.S. Just to clarify... we happy with the directive being '<b>pure</b>'?<br>
      </p>
      <p><br>
      </p>
      <div class="moz-cite-prefix">On 25/06/2019 06:20, Sven Barth via
        fpc-devel wrote:<br>
      </div>
      <blockquote type="cite"
        cite="mid:5abd8901-63c1-89f4-83e8-6dc60cd5b389@googlemail.com">Am
        25.06.2019 um 06:20 schrieb Marģers . via fpc-devel: <br>
        <blockquote type="cite">  <br>
          ----- Reply to message ----- <br>
          Subject: Re: [fpc-devel] XML node dump feature <br>
          Date: otrd., 25 jūn., 03:16 <br>
          From:  Ben Grasset <a class="moz-txt-link-rfc2396E"
            href="mailto:operator97@gmail.com" moz-do-not-send="true"><operator97@gmail.com></a>
          <br>
          To:  FPC developers' list <br>
          <a class="moz-txt-link-rfc2396E"
            href="mailto:fpc-devel@lists.freepascal.org"
            moz-do-not-send="true"><fpc-devel@lists.freepascal.org></a>
          <br>
          <br>
          <blockquote type="cite">const <br>
               A: TVec3F = (X: 1.2; Y: 2.4; Z: 3.8); <br>
               B: TVec3F = (X: 2.1; Y: 4.2; Z: 8.3); <br>
               // You can't do the next part currently, obviously <br>
               C: TVec3F = A + B; <br>
               D: TVec3F = A - B; <br>
               E: TVec3F = A * B; <br>
               F: TVec3F = A / B; <br>
            <br>
          </blockquote>
          Sorry to say but, this should not work even with <br>
          *pure* function.  Typed constants are not truly <br>
          constants. <br>
        </blockquote>
        Correct. Though considering that we're talking about *compile
        time* the compiler *could* treat consts (in {$J-} mode) as
        constants if pure functions are involved... Though it would need
        a bit more work as currently the compiler is "simply" piping the
        constant values of typed constants into the output assembly. <br>
        <br>
        Regards, <br>
        Sven <br>
        _______________________________________________ <br>
        fpc-devel maillist  -  <a class="moz-txt-link-abbreviated"
          href="mailto:fpc-devel@lists.freepascal.org"
          moz-do-not-send="true">fpc-devel@lists.freepascal.org</a> <br>
        <a class="moz-txt-link-freetext"
          href="https://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-devel"
          moz-do-not-send="true">https://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-devel</a>
        <br>
        <br>
        <br>
      </blockquote>
      <div id="DAB4FAD8-2DD7-40BB-A1B8-4E2AA1F9FDF2"><br>
        <table style="border-top: 1px solid #D3D4DE;">
          <tbody>
            <tr>
              <td style="width: 55px; padding-top: 13px;"><a
href="https://www.avast.com/sig-email?utm_medium=email&utm_source=link&utm_campaign=sig-email&utm_content=emailclient"
                  target="_blank" moz-do-not-send="true"><img
src="https://ipmcdn.avast.com/images/icons/icon-envelope-tick-round-orange-animated-no-repeat-v1.gif"
                    alt="" style="width: 46px; height: 29px;"
                    moz-do-not-send="true" width="46" height="29"></a></td>
              <td style="width: 470px; padding-top: 12px; color:
                #41424e; font-size: 13px; font-family: Arial, Helvetica,
                sans-serif; line-height: 18px;">Virus-free. <a
href="https://www.avast.com/sig-email?utm_medium=email&utm_source=link&utm_campaign=sig-email&utm_content=emailclient"
                  target="_blank" style="color: #4453ea;"
                  moz-do-not-send="true">www.avast.com</a> </td>
            </tr>
          </tbody>
        </table>
        <a href="#DAB4FAD8-2DD7-40BB-A1B8-4E2AA1F9FDF2" width="1"
          height="1" moz-do-not-send="true"> </a></div>
      <br>
      <fieldset class="mimeAttachmentHeader"></fieldset>
      <pre class="moz-quote-pre" wrap="">_______________________________________________
fpc-devel maillist  -  <a class="moz-txt-link-abbreviated" href="mailto:fpc-devel@lists.freepascal.org">fpc-devel@lists.freepascal.org</a>
<a class="moz-txt-link-freetext" href="https://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-devel">https://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-devel</a>
</pre>
    </blockquote>
  </body>
</html>