It's not so much convenience... it's more the fact that the compiler can and will optimise out "if (MyValue>=ord(Low(TMyType))) and (MyValue<=Ord(High(TMyType))) then" because it has every reason to assume that MyValue cannot possibly take on a value that's less than Low(TMyType) or greater than High(TMyType), hence it gets shortcut and assumed to always be True.

When MyValue takes on an invalid value due to being read from a file, for example, then that's where problems occur because there's no clear-cut way to catch it.

Gareth aka. Kit


On 05/07/2019 01:04, Michael Van Canneyt wrote:


On Thu, 4 Jul 2019, Jonas Maebe wrote:

Be it implicit assignments in object creation,
clearing records with Default(TMyRecord), reading records from streams
etc etc.
The issue is here and it needs some solution. If you don't like
"is" for this purpose, why not to introduce a compiler intrinsic
Valid(MyValue) that would check if MyValue is within the allowed range
of its type?

Because it means that not a single transformation or check in the
compiler can assume that MyValue contains a valid value. Either the
compiler can assume validity and the manual check does not make any
sense, or the compiler cannot assume it and then the language's type
system becomes meaningless (*), and bitpacked arrays/records should be
removed from the language.

The whole point of a type system is that
a) the programmer is responsible to ensure variables are filled with
valid values when bypassing the type system (explicit typecasts, inline
assembly, variant records, absolute variables, "external" aliases, ...)

Correct.

But the whole idea of the intrinsic for enumerated is simply to save typing.
basically

if (myvalue>=ord(Low(TMyType))) and (MyValue<=Ord(High(TMyType))) then

becomes

if IsValid(myvalue,TMyType) then // or myvalue is TMyType or IsValid(MyValue)

The languague is full of such constructs already: "is" and "as". "for...in" SizeOf(), default(), assert(). These are all convenience methods, none of them are infallible: "Is" and "As" can also fail. Default can also fail. 'implicitly initialized global variables' can also fail.

This has not stopped anyone from adding them.

So I see no reason why we should not add this convenience method:
It is not at odds with the fact that the compiler can assume that an
enumerated value is in range.

Michael.
_______________________________________________
fpc-devel maillist  -  fpc-devel@lists.freepascal.org
https://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-devel



---
This email has been checked for viruses by Avast antivirus software.
https://www.avast.com/antivirus

_______________________________________________
fpc-devel maillist  -  fpc-devel@lists.freepascal.org
https://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-devel

Reply via email to