For..in enumerator for generic records?

classic Classic list List threaded Threaded
17 messages Options
Reply | Threaded
Open this post in threaded view
|

For..in enumerator for generic records?

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

_______________________________________________
fpc-pascal maillist  -  [hidden email]
http://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-pascal
Reply | Threaded
Open this post in threaded view
|

Re: For..in enumerator for generic records?

leledumbo
Administrator
> 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
Reply | Threaded
Open this post in threaded view
|

Re: For..in enumerator for generic records?

Sven Barth-2
In reply to this post by Ryan Joseph

Am 30.11.2016 05:35 schrieb "Ryan Joseph" <[hidden email]>:
>
> 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


_______________________________________________
fpc-pascal maillist  -  [hidden email]
http://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-pascal
Reply | Threaded
Open this post in threaded view
|

Re: For..in enumerator for generic records?

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

> On Nov 30, 2016, at 3:09 PM, Sven Barth <[hidden email]> wrote:
>
> Take a look at packages/fcl-stl/src/gvector.pp, it's a generic vector container that provides an enumerator.
>
>

Regards,
        Ryan Joseph

_______________________________________________
fpc-pascal maillist  -  [hidden email]
http://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-pascal
Reply | Threaded
Open this post in threaded view
|

Re: For..in enumerator for generic records?

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 <[hidden email]> wrote:
>
> There’s a class nested inside a class?? I never saw that before. What are all the inlines for btw?

Regards,
        Ryan Joseph

_______________________________________________
fpc-pascal maillist  -  [hidden email]
http://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-pascal
Reply | Threaded
Open this post in threaded view
|

Re: For..in enumerator for generic records?

Graeme Geldenhuys-6
In reply to this post by Ryan Joseph
On 2016-11-30 10:53, 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
_______________________________________________
fpc-pascal maillist  -  [hidden email]
http://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-pascal
Reply | Threaded
Open this post in threaded view
|

Re: For..in enumerator for generic records?

Marco van de Voort
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
_______________________________________________
fpc-pascal maillist  -  [hidden email]
http://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-pascal
Reply | Threaded
Open this post in threaded view
|

Re: For..in enumerator for generic records?

Graeme Geldenhuys-6
In reply to this post by Ryan Joseph
On 2016-11-30 04:03, 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
_______________________________________________
fpc-pascal maillist  -  [hidden email]
http://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-pascal
Reply | Threaded
Open this post in threaded view
|

Re: For..in enumerator for generic records?

Ryan Joseph
In reply to this post by Graeme Geldenhuys-6


> On Nov 30, 2016, at 6:19 PM, Graeme Geldenhuys <[hidden email]> 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

_______________________________________________
fpc-pascal maillist  -  [hidden email]
http://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-pascal
Reply | Threaded
Open this post in threaded view
|

Re: For..in enumerator for generic records?

Ryan Joseph
In reply to this post by Marco van de Voort

> On Nov 30, 2016, at 6:22 PM, Marco van de Voort <[hidden email]> 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

_______________________________________________
fpc-pascal maillist  -  [hidden email]
http://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-pascal
Reply | Threaded
Open this post in threaded view
|

Re: For..in enumerator for generic records?

Graeme Geldenhuys-6
In reply to this post by Marco van de Voort
On 2016-11-30 11:22, Marco van de Voort wrote:
> D2006/ FPC 2.6.0


Thanks for the correction Marco. Wow, that long ago already.


Regards,
  Graeme

_______________________________________________
fpc-pascal maillist  -  [hidden email]
http://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-pascal
Reply | Threaded
Open this post in threaded view
|

Re: For..in enumerator for generic records?

Ryan Joseph
In reply to this post by Graeme Geldenhuys-6


> On Nov 30, 2016, at 6:24 PM, Graeme Geldenhuys <[hidden email]> 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

_______________________________________________
fpc-pascal maillist  -  [hidden email]
http://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-pascal
Reply | Threaded
Open this post in threaded view
|

Re: For..in enumerator for generic records?

Mattias Gaertner
In reply to this post by Ryan Joseph
On Wed, 30 Nov 2016 18:24:11 +0700
Ryan Joseph <[hidden email]> wrote:

>[...] 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
_______________________________________________
fpc-pascal maillist  -  [hidden email]
http://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-pascal
Reply | Threaded
Open this post in threaded view
|

Re: For..in enumerator for generic records?

leledumbo
Administrator
In reply to this post by 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.

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.
Reply | Threaded
Open this post in threaded view
|

Re: For..in enumerator for generic records?

Sven Barth-2
In reply to this post by Ryan Joseph
On 30.11.2016 12:36, Ryan Joseph wrote:
>
>
>> On Nov 30, 2016, at 6:24 PM, Graeme Geldenhuys <[hidden email]> 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


_______________________________________________
fpc-pascal maillist  -  [hidden email]
http://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-pascal

trecenum.pp (1K) Download Attachment
Reply | Threaded
Open this post in threaded view
|

Re: For..in enumerator for generic records?

Ryan Joseph
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 <[hidden email]> 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

_______________________________________________
fpc-pascal maillist  -  [hidden email]
http://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-pascal
Reply | Threaded
Open this post in threaded view
|

Re: For..in enumerator for generic records?

Sven Barth-2
On 02.12.2016 08:22, 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


_______________________________________________
fpc-pascal maillist  -  [hidden email]
http://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-pascal

trecenum.pp (1K) Download Attachment