Am 11.11.2018 um 12:59 schrieb Ryan Joseph:
Since I’ve got a little more free time I wanted to see if there was a simple 
solution to issue in Pascal that causes quite a bit of friction for me, i.e. 
constructor boiler plate. In c++ there is “uniform initialization” for structs 
which uses the {} syntax. It’s basically identically to record consts in 
Pascal, i.e.

type
   tvec2 = record
     x,y:integer;
   end;

var
   vec: tvec2 = (x:1;y1);

but it can be used at runtime (unlike Pascal which is compile time only). Many 
months ago I mentioned this and got a little positive response so I’d to ask 
again since I could probably implement it now.

Are any of these ideas appealing?

1) Simply move the typed const syntax down into blocks and use the type name 
like a function i.e.,

var
  vec:tvec2;
begin
  vec := tvec2(x:1;y1);

2) providing advanced records are on and perhaps a mode switch or some other kind of 
decorator, auto generate an implicit constructor, given no other constructors named 
“create" in the structure exist. i.e.,

{$something+}
type
   tvec2 = record
     x,y:integer;
   end;
{$something-}

var
  vec:tvec2;
begin
   vec := tvec2.create(1,1); // tvec2 has no constructor defined so “create” 
with all public member fields as parameters is implicitly defined
   vec := tvec2.create; // “create” is a static class function with default 
values so we can do this
end.

Here is the proposed implicit constructor for tvec2:

class function 
create(_x:integer=default(integer);y:integer=default(integer)):tvec2;static;

I prefer #2 because it’s easiest to type and looks most natural to Pascal. Not 
sure what the downsides are even???
I'm not convinced that this feature is really needed, because one can simply create a constant and assign that, would transport a clear name as well. But *if* I had to decide I would pick #1, cause then there wouldn't be the chance to break existing code if a user decides to add a constructor to their record and some other code relies on there not being a constructor. Also due to the syntax TYPENAME(FIELDNAME:VALUE[;FIELDNAME:VALUE[;…]]) it's in principle possible to have the parser distinguish whether it's a typecast or a default constructor.

Regards,
Sven
_______________________________________________
fpc-pascal maillist  -  fpc-pascal@lists.freepascal.org
http://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-pascal

Reply via email to