From: Charles Hixson <charleshixson@earthling.net>
Subject: Re: Looping over a tagged record?
Date: Thu, 21 Jun 2001 17:08:02 GMT
Date: 2001-06-21T17:08:02+00:00 [thread overview]
Message-ID: <Xns90C76715EC98Fcharleshixsonearthli@207.217.77.23> (raw)
In-Reply-To: mailman.993045741.6638.comp.lang.ada@ada.eu.org
"M. A. Alves" <maa@liacc.up.pt> wrote in
news:mailman.993045741.6638.comp.lang.ada@ada.eu.org:
>> >. . , I was wondering if there is anyway to loop over all
>> >elements in the record, checking their type and then
>> >taking the right action...
>>
>> If you really need to do this, you probably should have put
>> the bounded strings into an array inside the record,
>> instead of just making them flat fields.
>
> Often I also want to merge record and array i.e. have named
> _and_ iteratable "components". Theoretically this comes down
> to "types as objects", which Ada doesn't have. Practically,
> a "standard" Ada idiom for this is an heterogenous array
> indexed on an enumeration e.g. (not tested):
>
> ...
> type Field_Ptr is access Field'Class;
> type Field_Names is (Field_1, Field_2, Field_3);
> type Record_Type is array(Field_Names) of Field_Ptr;
> A_Record: Record_Type := (
> Field_1 => Field_Constructor_A(...),
> Field_2 => Field_Constructor_A(...),
> Field_3 => Field_Constructor_B(...));
>
> Now we have a record-like object A_Record with "components"
> Field_1, Field_2 of "type" A and Field_3 of "type" B. This
> example assumes class-wide programming (including
> dispatching), with (tagged) type Field being the root of
> some derivation class. Iterating over A_Record's
> "components":
>
> for I in A_Record'Range loop
> Do_Something(A_Record(I).all); -- dispatching call
> end loop;
>
> Accessing "components" by name:
>
> Do_Something(A_Record(Field_1).all);
>
> This particular approach has a notorious shortcoming: field
> types are not checked (Field_Ptr values can reference _any_
> derived type in the class). The remedy for this is left as
> an exercise ;-)
>
It has the further shortcoming that one must know in advance
what kind of thing one is dealing with, rather than letting it
identify itself. (My main interest here.)
Currently what I'm thinking of as an answer it a file of fixed
size blocks, which are addressed via Ada.Direct_IO, somehow I
need to make them accessible to reading/writing via IO
statements. Perhaps this is AdaSockets? I haven't figured this
out yet. I may end up dropping into C to do this bit. What I
basically need to do is examine the incoming data and figure out
how long it is, and then read it into an appropriate Ada
structure. (And, if it's larger than one block, which
collection of blocks it is composed of.) Also I need to be able
to go the other direction. To take a (nearly) arbitrary data
structure, and write it out to a block, or collection of blocks,
perhaps not contiguous. Together with some identifying
information, so that when I read it back in I'll be able to
identify what kind of thing I'm reading. And I'll need to
maintain an index, etc., so that I'll be able to find it by key
value.
This part would be relatively straight-forward in C, but so far
I haven't figured out how to do it in Ada. So far it's looking
like everything is going to need to be descendant from some
particular tagged type (I'll probably call it persistant), which
will define a few basic methods (read, write, find, etc.) But
the answer that I can currently figure out how to do is to
implement everything but the inheritance in C. I'm finding this
quite distasteful, but I don't know what alternatives are
better. And figuring out how I can do this in a way that
doesn't make me rewrite everything whenever a new class is
described ...
This is quite annoying. Every language seems to have some
weakness in some part of the process. So far Python is the
hands-down winner for the store an object and retrieve it part
of the job. But it's relatively slow for all the rest. (Still,
it's also pretty easy to connect C to, say, SleepyCat DB, so
that isn't the determining factor.)
The family of languages that make it easy to read objects in
from disk, and have them be recognized as objects of the
appropriate type are all relatively slow (because they all use
interpreters/pseudo-machines). Once upon a time there was a
dialect of FORTH (Neon, by Kyria) that had a better choice. One
could specify which objects were bound at compile time, and
which would be determined dynamically. And in areas where
everything could be predetermined, it could be compiled
efficiently (for FORTH), where as when things were dynamic,
there was an extra layer of indirection. Unfortunately, they
killed themselves when they tried to transfer the program from
the Mac to the PC. (Too many comittments, and too few
resources.) Now I wouldn't say that FORTH was a particularly
good language in other ways, but that one flexibility almost
made up for all the deficiencies.
PyAda sounds like one step in this direction. I do need to
check into it. But it seems that this would essentially be the
same as calling C code from Ada. (In fact, I rather suspect
that it is implemented via Swig, in which case there would end
up being a quintuple language conversion, Ada-> C-> Python-> C->
Ada, and it's hard to see how that could be good.)
--
Charles Hixson
Copy software legally, the GNU way!
Use GNU software, and legally make and share copies of software.
See http://www.gnu.org
http://www.redhat.com
http://www.linux-mandrake.com
http://www.calderasystems.com/
http://www.linuxapps.com/
next prev parent reply other threads:[~2001-06-21 17:08 UTC|newest]
Thread overview: 54+ messages / expand[flat|nested] mbox.gz Atom feed top
2001-06-19 20:39 Looping over a tagged record? M R Goodwin
2001-06-19 21:31 ` Pascal Obry
2001-06-19 21:32 ` Pascal Obry
2001-06-19 22:20 ` Samuel T. Harris
2001-06-19 23:45 ` mgoodwinSPAMMY
2001-06-20 1:33 ` Pat Rogers
2001-06-20 3:13 ` Pat Rogers
2001-06-20 2:58 ` DuckE
2001-06-20 13:15 ` Ted Dennison
2001-06-20 15:01 ` M. A. Alves
2001-06-21 2:36 ` DuckE
2001-06-21 10:14 ` M. A. Alves
2001-06-21 13:24 ` Pat Rogers
2001-06-21 17:08 ` Charles Hixson [this message]
2001-06-21 18:58 ` tmoran
2001-06-21 23:02 ` Charles Hixson
2001-06-22 19:04 ` B.Gaffney
2001-06-22 20:36 ` Pascal Obry
2001-06-22 2:18 ` DuckE
2001-06-22 17:33 ` Charles Hixson
2001-06-22 18:24 ` tmoran
2001-09-13 0:29 ` Gnat Windows load error tmoran
2001-09-13 18:15 ` Jerry van Dijk
2001-09-13 23:17 ` tmoran
2001-09-13 3:58 ` Ada web crawler tmoran
2001-11-17 21:50 ` ada.strings.bounded slice errors tmoran
2001-11-18 17:16 ` Florian Weimer
2001-11-18 19:31 ` tmoran
2001-11-19 7:12 ` Florian Weimer
2002-02-08 20:55 ` How to get a traceback in Gnat 3.14p tmoran
2002-02-08 21:24 ` Pascal Obry
2002-02-08 22:28 ` tmoran
2002-02-11 0:10 ` How to use gnatelim in Gnat 3.14p? tmoran
2002-02-15 17:23 ` does gnatelim work? tmoran
2002-02-15 18:18 ` Stephen Leake
2002-02-15 21:58 ` tmoran
2002-02-18 1:31 ` Stephen Leake
2002-04-15 3:05 ` Announce: .rc files with Gnat tmoran
2002-04-15 14:48 ` Ted Dennison
2002-05-25 7:06 ` slice'access? tmoran
2002-05-25 16:47 ` slice'access? Robert Dewar
2002-05-25 18:28 ` slice'access? tmoran
2002-05-25 20:20 ` slice'access? Jeffrey Carter
2002-05-25 23:39 ` slice'access? tmoran
2002-05-26 14:22 ` slice'access? Robert Dewar
2002-09-30 1:54 ` 'write of bounded string? tmoran
2002-09-30 16:06 ` Stephen Leake
2002-10-27 23:01 ` phone# etc bdean
2002-10-28 3:04 ` tmoran
2002-11-06 3:14 ` A little Ada app tmoran
2002-11-06 11:37 ` Larry Kilgallen
2002-11-06 15:08 ` Ted Dennison
2002-11-06 18:02 ` tmoran
2001-06-21 3:09 ` Looping over a tagged record? gresset1
replies disabled
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox