Am Di., 27. Nov. 2018, 14:00 hat Ryan Joseph <r...@thealchemistguild.com>
geschrieben:

>
>
> > On Nov 27, 2018, at 5:35 PM, Sven Barth via fpc-pascal <
> fpc-pascal@lists.freepascal.org> wrote:
> >
> > 1) kSomeDays is a typed const so I get a load node instead of
> tsetconstnode, which I need to need to know in order to make the name
> string. See the TODO’s in tgenericparamdef.create.
> >
> > type
> >         TDay = (Mon, Tue, Wed);
> >         TDays = set of TDay;
> > const
> >         kSomeDays:TDays = [Mon, Wed];
> >
> >
> > var
> >         d: specialize TMyRecord_Set<integer,kSomeDays>; // this doesn’t
> work
> >         d: specialize TMyRecord_Set<integer,[Mon,Wed]>; // this works
> because I get a set node
> >
> > The difference between typed and untyped constants are available
> everywhere else in the language as well, so I have no qualms (at least for
> now?) to error out on them.
>
> You mean reject them? The default behavior is to get a
> type_e_type_id_expected error. They can be included easily but I don’t know
> how to get the set from the load node (I think it needs further parsing).
>

We can add a new message that says "type id or untyped constant expected".
But if it correctly errors right now, we can leave it be for now.


> >
> > For sets I believe that this should work however (see here:
> https://freepascal.org/docs-html/current/ref/refse9.html#x21-200002.1 ):
> >
> > === code begin ===
> > const
> >   kSomeDays = [Mon, Wed];
> > === code end ===
>
> Yes, sets work because I get a setnode which I can operate on.
>
> >
> > Did you try with the generic and the specialization in different units
> and changing only one of the two? Though you might want to check whether
> tstoreddef.ppuload (or wherever tdef.genericparas is initialized after a
> unit load) correctly instantiated the tconstsym instances instead of
> ttypesym ones. It might already work correctly, but better safe than sorry.
> 😅
>
> That seems to work. Here is my test:
>
> ========================================
>
> program gc_ppu;
> uses
>         gc_types_unit;
>
> var
>         a: TShortIntList;
> begin
>         a.dothis('hello’);
>         GlobalShortIntList.dothis('world');
> end.
>
> ========================================
>
> unit gc_types_unit;
> interface
>
> type
>         generic TList<T, const U:integer> = record
>                 const ID = U;
>                 public
>                         list: array[0..U-1] of T;
>                         procedure dothis (msg:string);
>         end;
>
> const
>         kShortListLength = 128;
> type
>         TShortIntList = specialize TList<Shortint,kShortListLength>;
>
> var
>         GlobalShortIntList: TShortIntList;
>
> implementation
>
> procedure TList.dothis (msg:string);
> begin
>         writeln('message:',msg, ' high:', high(ID), ' constsize:',
> sizeof(ID), ' structsize:', sizeof(self));
> end;
>
> end.
>

You did read the part about the generic and the specialization being
located in two different units? 😉

Regards,
Sven

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

Reply via email to