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

Mailing lists / fpc-pascal / 2016-11
17 messages · 6 people · –
Reply by email Subscribe to this list Your subscription
Read-only archive. Use j and k to move between messages.
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
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
"Ryan Joseph" wroteI 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
There’s a class nested inside a class?? I never saw that before. What are all the inlines for btw?
Regards,
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
There’s a class nested inside a class?? I never saw that before. What are all the…
Ryan Joseph wroteThere’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
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
I have a generic record I would like to enumerate using for..in loops. Is this even…
Ryan Joseph wroteI 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
Yeah, those were introduced in FPC 3.0.0 I believe - more Delphi compatibility changes. I…
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
In our previous episode, Graeme Geldenhuys said: D2006/ FPC 2.6.0 from 2.6.0 release…
On Nov 30, 2016, at 6:22 PM, Marco van de Voort wrote: * (for..in) Enumerators in records
Where’s an example of this? I’m trying it with a generic record and I can’t it to compile so I’m not sure if this is supported or not.
Regards,
Ryan Joseph
In our previous episode, Graeme Geldenhuys said: D2006/ FPC 2.6.0 from 2.6.0 release…
Marco van de Voort wroteD2006/ FPC 2.6.0
Thanks for the correction Marco. Wow, that long ago already.
Regards,
Graeme
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
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
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.
I have a dynamic array inside a record. I’m using a record instead of a class because I…
I've attached an example that shows how this *can* be done (it's not the only way to do this however).
Regards,
Sven
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
Ryan Joseph wroteYes 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