Sign in Join

Live chat for Free Pascal, Lazarus, Delphi and every Pascal programmer.

Mailing lists / fpc-pascal / 2016-11

For..in enumerator for generic records?

17 messages · 6 people · –

Reply by email Subscribe to this list Your subscription

Read-only archive. Use j and k to move between messages.

Ryan Joseph

I have a generic record I would like to enumerate using for..in loops. Is this even possible? I tried briefly and it wasn’t clear this was possible so I thought I’d ask first. Thanks.

Regards,
Ryan Joseph

Reply by email

leledumbo
to Ryan Joseph
I have a generic record I would like to enumerate using for..in loops. Is

this even possible? I tried briefly and it wasn’t clear this was possible so I thought I’d ask first. Thanks.

Take a look at how gvector implements it:
http://svn.freepascal.org/svn/fpc/tags/release_3_0_0/packages/fcl-stl/src/gvector.pp

View this message in context: http://free-pascal-general.1045716.n5.nabble.com/For-in-enumerator-for-generic-records-tp5726980p5726981.html Sent from the Free Pascal - General mailing list .

Reply by email

Sven Barth
"Ryan Joseph" wrote
I have a generic record I would like to enumerate using for..in loops. Is

this even possible? I tried briefly and it wasn’t clear this was possible so I thought I’d ask first. Thanks.

Take a look at packages/fcl-stl/src/gvector.pp, it's a generic vector container that provides an enumerator.

Regards,
Sven

Reply by email

Ryan Joseph
to Sven Barth

There’s a class nested inside a class?? I never saw that before. What are all the inlines for btw?

Show quoted text 5 lines
On Nov 30, 2016, at 3:09 PM, Sven Barth wrote: Take a look at packages/fcl-stl/src/gvector.pp, it's a generic vector container that provides an enumerator.

Regards,
Ryan Joseph

Reply by email

Ryan Joseph
to Ryan Joseph

I just tried this really quick and it doesn’t seem to work with records but if I changed it to a class that worked. Maybe I should use an object instead so it’s stored on the stack like a record? Not very important it can enumerate but I wanted to try first.

On Nov 30, 2016, at 5:53 PM, Ryan Joseph wrote: There’s a class nested inside a class?? I never saw that before. What are all the inlines for btw?

Regards,
Ryan Joseph

Reply by email

Graeme Geldenhuys
to Ryan Joseph: There’s a class nested inside a class?? I never saw that before. What are all the…
Ryan Joseph wrote
There’s a class nested inside a class?? I never saw that before.

Yeah, those were introduced in FPC 3.0.0 I believe - more Delphi compatibility changes. I still don’t know if I like it though, but understand its usage is meant if two classes are very close related. You can now have nested classes (god knows how deep), constants, vars etc all inside a class definition. The Delphi version of the Object Pascal language is becoming pretty messy.

Regards,
Graeme

fpGUI Toolkit - a cross-platform GUI toolkit using Free Pascal http://fpgui.sourceforge.net/ My public PGP key: http://tinyurl.com/graeme-pgp

Reply by email

Marco van de Voort
to Graeme Geldenhuys

In our previous episode, Graeme Geldenhuys said:

Yeah, those were introduced in FPC 3.0.0

D2006/ FPC 2.6.0

from 2.6.0 release manifest:
http://forum.lazarus.freepascal.org/index.php?topic=15656.0

* Delphi compatibility mode improvements
* Nested types, class variables and class local constants
* Advanced records syntax (no constructors yet)
* (for..in) Enumerators in records
* Class and record helpers
* Generic records, arrays and procedural types
* Delphi-compatibility of generics improved
* Scoped enumerations
* Custom messages for "deprecated" directive
* Ability to use "&" for escaping keywords

Reply by email

Graeme Geldenhuys
to Ryan Joseph: I have a generic record I would like to enumerate using for..in loops. Is this even…
Ryan Joseph wrote
I have a generic record I would like to enumerate using for..in loops.

Maybe generics are redefining this, but a record (as I understand it) is something like

   TMyRec = record
     StrField: string;
     IntField: integer;
     BoleanField: boolean;
   end;

What would you iterate/enumerate in that? I can understand iterating an "array of TMyRec", but not TMyRec itself.

Regards,
Graeme

fpGUI Toolkit - a cross-platform GUI toolkit using Free Pascal http://fpgui.sourceforge.net/ My public PGP key: http://tinyurl.com/graeme-pgp

Reply by email

Ryan Joseph
to Graeme Geldenhuys: Yeah, those were introduced in FPC 3.0.0 I believe - more Delphi compatibility changes. I…
Show quoted text 8 lines
On Nov 30, 2016, at 6:19 PM, Graeme Geldenhuys wrote: Yeah, those were introduced in FPC 3.0.0 I believe - more Delphi compatibility changes. I still don’t know if I like it though, but understand its usage is meant if two classes are very close related. You can now have nested classes (god knows how deep), constants, vars etc all inside a class definition. The Delphi version of the Object Pascal language is becoming pretty messy.

Big mess indeed. I can wrap my head around nested types in classes because they’re necessary for generics I just learned but nested classes feel messy. Is there at least some namespace protection? That would be a benefit I suppose if the class was only ever used inside that class but a unit may be a better option in that case.

Regards,
Ryan Joseph

Reply by email

Ryan Joseph
to Graeme Geldenhuys: Maybe generics are redefining this, but a record (as I understand it) is something like…
On Nov 30, 2016, at 6:24 PM, Graeme Geldenhuys wrote: What would you iterate/enumerate in that? I can understand iterating an "array of TMyRec", but not TMyRec itself.

I have a dynamic array inside a record. I’m using a record instead of a class because I want it to be stored on the stack. It’s trivial to just enumerate the array inside the record but I wanted to try the more elegant solution of making an enumerator for the record.

Regards,
Ryan Joseph

Reply by email

Mattias Gaertner
to Ryan Joseph: Big mess indeed. I can wrap my head around nested types in classes because they’re…
[...] I can wrap my head around nested types in classes because they’re necessary for generics I just learned but nested classes feel messy. Is there at least some namespace protection?

Yes.
And it follows visibility rules.

That would be a benefit I suppose if the class was only ever used inside that class but a unit may be a better option in that case.

Mattias

Reply by email

leledumbo
to Ryan Joseph: I just tried this really quick and it doesn’t seem to work with records but if I…
I just tried this really quick and it doesn’t seem to work with records but

if I changed it to a class that worked.

Just as you can't declare next field to be a record when learning linked list (well, we normally learned that some time in the past), the solution is just the same here: declare and use pointer to the record instead. Using classes, however, the pointer can be abstracted and you will have less messy code.

View this message in context: http://free-pascal-general.1045716.n5.nabble.com/For-in-enumerator-for-generic-records-tp5726980p5726995.html Sent from the Free Pascal - General mailing list .

Reply by email

Sven Barth
to Ryan Joseph: I have a dynamic array inside a record. I’m using a record instead of a class because I…
Ryan Joseph wrote 8 lines
> On Nov 30, 2016, at 6:24 PM, Graeme Geldenhuys wrote: > > What would you iterate/enumerate in that? I can understand iterating an > "array of TMyRec", but not TMyRec itself. I have a dynamic array inside a record. I’m using a record instead of a class because I want it to be stored on the stack. It’s trivial to just enumerate the array inside the record but I wanted to try the more elegant solution of making an enumerator for the record.

I've attached an example that shows how this *can* be done (it's not the only way to do this however).

Regards,
Sven

Reply by email

Ryan Joseph
to Sven Barth

Yes but the problem is doing this with generics. :) That’s where I got stuck and I don’t think it’s possible.

On Dec 2, 2016, at 4:58 AM, Sven Barth wrote: I've attached an example that shows how this *can* be done (it's not the only way to do this however).

Regards,
Ryan Joseph

Reply by email

Sven Barth
to Ryan Joseph
Ryan Joseph wrote
Yes but the problem is doing this with generics. :) That’s where I got stuck and I don’t think it’s possible.

Ah, yes, right, sorry. Attached is a corrected version :)

Regards,
Sven

Reply by email