<div dir="ltr"><div class="gmail_extra"><div class="gmail_quote">On Sun, Jan 31, 2016 at 11:43 AM, Sven Barth <span dir="ltr"><<a href="mailto:pascaldragon@googlemail.com" target="_blank">pascaldragon@googlemail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">Hello together!<br>
<br>
I've finally come around to add a feature that many people have asked<br>
for throughout the years: an inline if that works like the if-statement<br>
in that it only evaluates that expression that is indeed returned.<br>
<br>
After the discussion last year about the inline-if I've decided to add<br>
it as an intrinsic function instead of an extension of the language.<br>
Like all intrinsics it's part of the System unit and "declared" like this:<br>
<br>
=== code begin ===<br>
<br>
function IfThen(Condition: Boolean; ThenExpr, ElseExpr: type): type;<br>
<br>
=== code end ===<br>
<br>
Since it's declared in the System unit it won't interfere with the<br>
IfThen()s that are declared in the Math unit or other units, so they'll<br>
continue to work as before to avoid any surprises.<br>
<br>
An important point to note is that in general the result type is<br>
determined by the ThenExpr (there are a few usability exceptions<br>
regarding strings and chars).<br>
<br>
Examples:<br>
<br>
=== code begin ===<br>
<br>
function A: LongInt;<br>
begin<br>
  A := 42;<br>
end;<br>
<br>
function B: LongInt;<br>
  B := 21;<br>
end;<br>
<br>
var<br>
  i, j: LongInt;<br>
  s: String;<br>
begin<br>
  i := 42;<br>
  j ;= IfThen(i < 32, 48, 21);<br>
<br>
  j := IfThen(True, 23, 49); // compiler will warn of unreachable code<br>
  j := IfThen(False, 23, 49); // compiler will warn of unreachable code<br>
<br>
  j := IfThen(i < 32, A, B); // in this case only B will be executed<br>
<br>
  //j := IfThen(i < 32, 32, '123'); // this will fail if there's no<br>
suitable conversion operator available<br>
<br>
  //s := IfThen(j < 32, #42, 'Foo'); // this will fail as a char is expected<br>
  s := IfThen(j < 32, #42, #3294); // this will work however and will<br>
result in a WideChar<br>
  s := IfThen(j < 32, 'Hello World', 'Hello'#3294'World'); // this will<br>
also work and will result in a WideString (and a warning as s is a<br>
Short-/AnsiString)<br>
end;<br>
<br>
=== code end ===<br>
<br>
If there are any combinations of types that should work, but do not,<br>
please don't hesistate to report them at <a href="http://bugs.freepascal.org/" rel="noreferrer" target="_blank">http://bugs.freepascal.org/</a><br></blockquote></div><div class="gmail_extra"><br></div><div class="gmail_extra">Wooow! I did a request about it many years ago, however it was rejected because the limitation in the generic feature at that time.</div><div class="gmail_extra"><br></div><div class="gmail_extra">So, I posted a bug related to it yesterday:</div><div class="gmail_extra"><br></div><div class="gmail_extra"><a href="http://bugs.freepascal.org/view.php?id=29546">http://bugs.freepascal.org/view.php?id=29546</a><br></div><div class="gmail_extra"><br></div><div class="gmail_extra">Can I use it after this new feature? (I'm upgrading my FPC sources now :-) )</div><div class="gmail_extra"><br></div><div class="gmail_extra">Buddy, thanks a lot for that feature, it is very useful! o/</div><div class="gmail_extra"><br></div>-- <br><div class="gmail_signature"><div dir="ltr"><div>Silvio Clécio</div></div></div>
</div></div>