[fpc-devel] Limitations of static "ranged" integer typesandsucc/pred, and dynamic solution.
Skybuck Flying
skybuck2000 at hotmail.com
Sat Dec 24 10:52:50 CET 2011
-----Original Message-----
From: Marco van de Voort
Sent: Friday, December 23, 2011 13:21
To: FPC developers' list
Subject: Re: [fpc-devel] Limitations of static "ranged" integer
typesandsucc/pred, and dynamic solution.
In our previous episode, Skybuck Flying said:
>
> Currently there simply is no dynamic/runtime version of it.
"
You are totally right. Please submit a patch for conforming arrays support
:-)
"
Glad you agree, now we can discuss possible solutions ;) :)
First a solution has to be found, possible solutions could be:
TRangedInteger = record
Low : integer;
High : integer;
Value : integer;
end;
or perhaps just a range or perhaps both.
TRange = record
Low : integer;
High : integer;
end;
And then perhaps some checks/runtime checks can be build in by the compiler.
Alternatively perhaps assignment operation, increment operator and other
operators could be overloaded to do the necessary range checking ;)
I am not sure what Low/High/Succ/Pred do ? Do they ever throw an runtime
error, or exception ?
Perhaps just having a constructor would already be enough to just solve the
loop:
var
vIndex : TRangedInteger;
vValue : TRangedInteger; // problem, need to set range again :(
begin
vIndex := TRangedInteger.Create( -Random(100), Random(100) );
vValue := TRangedInteger.Create( vIndex ); // perhaps could be solved
with a copy from the other.
// would be more nice if it was like a dynamic type or so ;)
vRange := TRangedInteger.Create( 0, AskUserForMax ); // ask user for
values
vIndex := TRangedInteger.Create( vRange );
vValue := TRangedInteger.Create( vRange );
for vIndex := vIndex.Low to vIndex.High do
begin
if vValue = vValue.High then
begin
vValue.Low;
end else
begin
vValue := vValue.Succ;
end;
end;
end;
So you see coming up with a solution wasn't that hard, however this is still
a somewhat half-baked solution.
It would be nice if simply Low(vValue) and High(vValue) could be used, so
static (compile-time)and dynamic code (run-time) looks the same and can be
compiled without code changes.
So somehow Low and High would need to be "attached" to the runtime type:
TRangedInteger.
Perhaps Low and High and Succ and Pred should become "operators" ? For
record ?!?
So that they can be overriden ?
Bye,
Skybuck.
More information about the fpc-devel
mailing list