comp.lang.ada
 help / color / mirror / Atom feed
From: stt@spock.camb.inmet.com (Tucker Taft)
Subject: Re: Mut. Recurs. in Ada9X w/o Breaking Encaps.? (LONG)
Date: Thu, 29 Sep 1994 18:05:09 GMT
Date: 1994-09-29T18:05:09+00:00	[thread overview]
Message-ID: <CwwKwM.Cnq@inmet.camb.inmet.com> (raw)
In-Reply-To: 36eebb$jn5@disunms.epfl.ch

In article <36eebb$jn5@disunms.epfl.ch>,
Magnus Kempe <Magnus.Kempe@di.epfl.ch> wrote:
> ...
>The example below illustrates that Ada 9X allows you to easily model/
>implement abstractions and their relationships--while enforcing and
>preserving the concomitant encapsulations.  That's what I call progress!
>(Yes, this all compiles with GNAT, a.k.a. "GNU Ada".)

The type conversion toward the end of your example is
illegal (at least according to *our* Ada 9X front end ;-).
Remember GNAT is focusing on compiling correct programs first,
and will eventually enforce all of the nit-picking RM rules,
but for now, just because GNAT compiles something doesn't make it legal ...

In any case, to me it is much simpler to declare abstract
versions of Employee and Office in the same package, with appropriately
mutually recursive (abstract) operations declared there as well.
E.g.:

    package Company is
        type Office is abstract tagged null record;
        type Office_Pointer is access all Office'Class;

        type Employee is abstract tagged null record;
        type Employee_Pointer is access all Employee'Class;

        function Office_Occupied_By(The_Employee : Employee)
          return Office_Pointer is abstract;

        function Employee_Occupying (The_Office : Office)
          return Employee_Pointer is abstract;

        procedure Occupy (The_Office : in Office_Pointer;
                          The_Employee : in Employee_Pointer);
          -- This one we presumably have to implement (though
          -- I'm not sure what the original author had in mind),
          -- perhaps by calling additional abstract primitive operations 
	  -- declared below....
          
      ...

    end Company;

You can then create concrete derivatives of these in separate packages,
preserving complete encapsulation relative to one another (presuming
that is a big deal).  Few if any explicit conversions will be required
with this approach.

>Magnus Kempe		"I know not what course others may take, but as for me,
>Magnus.Kempe@di.epfl.ch  Give me Liberty... or give me Death!" -- Patrick Henry

-Tucker Taft   stt@inmet.com
Intermetrics, Inc.
Cambridge, MA  02138

-------------------
P.S. FYI Here is the source code you suggested, with an indication
of where the error occurs:

> ...
>package Company is
>-- This subsystem exports two abstractions, Employee and Office, which
>-- are mutually dependent (in a symmetric, one-to-one relationship).
>
>private
>-- the following private declarations set up the 1-1 relationship
>
> ... [Eliding employee stuff]
>
>  type Office_Parent;
>  type Office_Reference is access all Office_Parent'Class;
>
> ... [Eliding employee stuff]
>
>  type Office_Parent is
>    abstract tagged
>    record
>      Its_Occupying_Employee : Employee_Reference;
>    end record;
>end Company;
>
> ... [Eliding employee stuff]
>
>with ... ; -- other stuff needed by Office
>package Company.Offices is
>  type Office is
>    private;
>  type Office_Pointer is
>    access all Office;
>
>  No_Office : constant Office_Pointer := null;
>  ... -- Office subprograms involving that "other stuff"
>
>private
>  type Office is
>    new Office_Parent
>    with record
>      ... -- various components involving that "other stuff"
>    end record;
>end Company.Offices;
>
>
>-- we can now declare operations working with both abstractions
>---------------------------------------------------------------
>with
>  Company.Employees, Company.Offices;
>package Company.Common is
>  function Office_Occupied_By (The_Employee : in Employees.Employee)
>    return Offices.Office_Pointer;
>
> ... [Eliding employee stuff]
>end Company.Common;
>
> ... [Eliding employee stuff]
>
>with Company.Employees.Ptrs;
>package body Company.Common is
>  function Office_Occupied_By (The_Employee : in Employees.Employee)
>    return Offices.Office_Pointer is
>  begin
>    return Offices.Office_Pointer
>             (Employees.Ptrs.Office_of (The_Employee));
>    -- the type conversion (from one access type to another) involves
>    -- a type check: is the designated object of type Offices.Office?
>    -- If not, exception Constraint_Error will be raised.

***** Here is the problem ****
This type conversion is illegal, since at this point, it is
not visible that Office is derived from Office_Parent.

>  end Office_Occupied_By;
> ...



  reply	other threads:[~1994-09-29 18:05 UTC|newest]

Thread overview: 43+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
1994-09-27 16:52 Mut. Recurs. in Ada9X w/o Breaking Encaps.? (LONG) John Volan
1994-09-27 18:48 ` Mark A Biggar
1994-09-29  1:46   ` John Volan
1994-09-29 13:57     ` Tucker Taft
1994-09-29 17:20       ` Bjarne Stroustrup <9758-26353> 0112760
1994-09-30  1:38         ` Tucker Taft
1994-09-30 12:33           ` Bjarne Stroustrup <9758-26353> 0112760
1994-09-29 18:37       ` John Volan
1994-09-29 19:34         ` David Weller
1994-09-30 22:13           ` John Volan
1994-10-02  3:31             ` Andrew Lees
1994-09-30  1:47         ` Tucker Taft
1994-09-30 13:30           ` John Volan
1994-09-29 18:10     ` R. William Beckwith
1994-10-03  0:33     ` Cyrille Comar
1994-09-28 14:01 ` Norman H. Cohen
1994-09-29  2:12   ` John Volan
1994-09-29 14:01     ` Tucker Taft
1994-09-29 18:37     ` Norman H. Cohen
1994-09-29  9:48   ` Magnus Kempe
1994-09-29 13:10     ` Magnus Kempe
1994-09-29 18:05       ` Tucker Taft [this message]
1994-09-30 10:20         ` Mut. Recurs. in Ada9X w/o Breaking Encaps.? Magnus Kempe
1994-09-30 13:22           ` Tucker Taft
1994-10-01  1:24       ` Mut. Recurs. in Ada9X w/o Breaking Encaps.? (LONG) Adam Beneschan
1994-10-01 12:01         ` Magnus Kempe
1994-10-01 18:43         ` Mark A Biggar
1994-10-02 16:41         ` John Volan
1994-10-02 23:33           ` Matt Kennel
1994-10-03  8:07           ` Mut. Recurs. in Ada9X w/o Breaking Encaps.? Magnus Kempe
1994-10-03 12:14           ` Mut. Recurs. in Ada9X w/o Breaking Encaps.? (LONG) Robert I. Eachus
1994-10-04  2:12             ` R. William Beckwith
1994-10-04 16:00             ` John Volan
1994-10-05 11:42               ` Robert I. Eachus
1994-10-05 21:09               ` Matt Kennel
1994-10-03 20:29           ` Harry Koehnemann
1994-09-29 13:35     ` John Volan
1994-09-30 20:27       ` Norman H. Cohen
1994-10-01  1:47         ` John Volan
1994-10-01 20:44           ` Tucker Taft
1994-10-03 11:29           ` Robert I. Eachus
1994-09-30 22:46       ` Matt Kennel
1994-10-01  2:11         ` John Volan
replies disabled

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