[fpc-devel] Thoughts on being able to declare "pointer-to-type" parameters directly in method signatures?

Martin Frb lazarus at mfriebe.de
Mon Jun 10 12:21:07 CEST 2019


On 10/06/2019 02:47, Ben Grasset wrote:
> Yes? Obviously? I clearly demonstrated the technical benefit in my 
> original comment. *Yet again *though I do not understand why this is 
> controversial. It would amount to a very tiny syntax addition, that 
> does *nothing *other than make certain things *easier* to write.
>
Well a few points from my side.

Your first post (if I have it right) was about generics:
   procedure MemCopy<T>(Dest: ^T; Src: ^T; Len: PtrUInt);
A case in which the type is determined later, and you cannot (easily) 
declare the pointer type in advance)

To start with, I can see the appeal for that case.

Problem 1: Overloading.

program Project1;
type
   Ta = type ^byte;
   Tb = type ^byte;

procedure P1(x: Ta); overload;
begin  writeln(1); end;

procedure P1(x: Tb); overload;
begin  writeln(2); end;

begin
   P1(Ta(1));
   P1(Tb(1));
end.

If you did have "procedure P1(x: ^Byte); overload;", how would you call it?

Problem 2:
pointer to pointer?
This is not allowed in type:
   type PPFoo = ^^Foo;
But what if you need it for a param?

Problem 3:
You stated (IIRC, somewhere in this thread), this was a special case for 
pointers only. All the other types that can be declared are not needing 
this.
Well, that may be true for inline record declarations, though you could 
call them with a constant:
    procedure P1(record a,b: Byte end); overload;
and
     P1( (a:1; b:2) );

Yes it is more far fetched. But gets closer with each step.

The possible next step, if pointers would be agreed on, might be sets. 
They are identical to the pointer issue. (At specialization T must 
substituted by an existing enum)
   procedure Foo<T>(arg: set of T);
The enum values of T are known, so this can be called.

And to extend on this, if specialization can also take constants, then 
ranges would be in the same category
   procedure Foo<A,B>(arg: A..B);
Actually
   type TBar = class
     const A=1; B=5;
   end
   procedure Foo<T>(arg: T.A..T.B);

So this is all, but limited to pointers.




-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.freepascal.org/pipermail/fpc-devel/attachments/20190610/712eb0c4/attachment.html>


More information about the fpc-devel mailing list