comp.lang.ada
 help / color / mirror / Atom feed
From: Per Sandberg <per.sandberg@bredband.net>
Subject: Re: 'Image for composite types
Date: Thu, 28 May 2009 05:36:15 +0200
Date: 2009-05-28T05:36:15+02:00	[thread overview]
Message-ID: <jsoTl.44588$TE3.20029@newsfe13.ams2> (raw)
In-Reply-To: <f241da28-497c-450a-a804-829eaa1f7608@l28g2000vba.googlegroups.com>

Have a look on:
   http://www.stephe-leake.org/ada/auto_text_io.html
I don know the exact state of it but it may help.
/Per


Martin wrote:
> Is it just me that gets fed up with the lack of 'Image on composite
> types?
> 
> I'm thinking in particular of when I'm testing / debugging and usually
> end up writing lots of 'Put_Line' code for each and every record. And
> then having to maintain them.
> 
> It got me thinking that the language could be expanded to include some
> helper attributes for easily composing a function that could return a
> String a la 'Image for scalar types.
> 
>    function record_type_definition'Component_Name (I : Positive)
> return String;
>    function record_type_definition'Component_Image (I : Positive)
> return String;
>    function record_type_definition'Number_Of_Components return
> Natural;
> 
>    Example
>    =======
>       type Person is
>          record
>             Name   : Unbounded_String;
>             Age    : Natural;
>             Height : Float;
>             Weight : Float;
>          end record;
>    ...
>       procedure Put_Line (P : Person) is
>       begin
>          Put_Line (P.Name);
>          for I in 2 .. Person'Number_Of_Components (P) loop
>             Put_Line (Person'Component_Name (I) & " => " &
> Person'Component_Image (I));
>          end loop;
>       end Put_Line;
>    ...
>       Me : Person := (Name   => To_Unbounded_String ("Martin"),
>                       Age    => 40,
>                       Height => 1.70,
>                       Weight => 82.5);
>    begin
>       Put_Line (Me);
>    ...
> 
> Gives output:
> Martin
> Age => 40
> Height => 1.70
> Weight => 82.5
> 
> 
> Or I could define a generic procedure for any of my record types, e.g.
> 
>    generic
>       type Record_Type is private;
>    procedure Put_Line (R : Record_Type);
> 
>    procedure Put_Line (R : Record_Type) is
>    begin
>       -- Notice: no actual names are used at all...
>       for R in 1 .. Record_Type'Number_Of_Components loop
>          Put_Line (Record_Type'Component_Name (R) & " => "
> Record_Type'Component_Image (R));
>       end loop;
>    end Put_Line;
> 
> It might be nice if the language defined a default 'Image for
> composites that could be overridden, e.g.
> 
> function array_type_definition'Image return String;
> 
>    Example
>    =======
>    type My_Array is array ...;
>    for array_type_definition'Image use To_String;
> 
>    function To_String (D : My_Array) return String;
> 
> 
> function record_type_definition'Image return String;
> 
>    Example
>    =======
>    type My_Record is record ...;
>    for My_Record'Image use To_String;
> 
>    function To_String (R : My_Record) return String;
> 
> Anyone think something like this has legs?
> 
> Cheers
> -- Martin



  parent reply	other threads:[~2009-05-28  3:36 UTC|newest]

Thread overview: 15+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2009-05-27 22:20 'Image for composite types Martin
2009-05-27 23:23 ` Robert A Duff
2009-05-27 23:44 ` Adam Beneschan
2009-05-28  6:46   ` Martin
2009-05-28  9:53   ` Georg Bauhaus
2009-05-28 10:42     ` Martin
2009-05-28 11:31       ` Georg Bauhaus
2009-05-28 16:25       ` Jeffrey R. Carter
2009-05-28 16:47         ` Martin
2009-05-28  3:36 ` Per Sandberg [this message]
2009-05-28  5:15   ` tmoran
2009-06-06  9:17   ` Martin
2009-05-28  9:13 ` Dmitry A. Kazakov
2009-05-31 12:17 ` Stephen Leake
2009-06-06  9:17   ` Martin
replies disabled

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox