Lady Ada

Ada '83 Language Reference Manual

Copyright 1980, 1982, 1983 owned by the United States Government. Direct reproduction and usage requests to the Ada Information Clearinghouse.


7.3. Package Bodies

[PREVIOUS][UP][NEXT]

In contrast to the entities declared in the visible part of a package specification, the entities declared in the package body are only visible within the package body itself. As a consequence, a package with a package body can be used for the construction of a group of related subprograms (a package in the usual sense), in which the logical operations available to the users are clearly isolated from the internal entities.

For the elaboration of a package body, its declarative part is first elaborated, and its sequence of statements (if any) is then executed. The optional exception handlers at the end of a package body service exceptions raised during the execution of the sequence of statements of the package body.

Notes:

A variable declared in the body of a package is only visible within this body and, consequently, its value can only be changed within the package body. In the absence of local tasks, the value of such a variable remains unchanged between calls issued from outside the package to subprograms declared in the visible part. The properties of such a variable are similar to those of an "own" variable of Algol 60.

The elaboration of the body of a subprogram declared in the visible part of a package is caused by the elaboration of the body of the package. Hence a call of such a subprogram by an outside program unit raises the exception PROGRAM_ERROR if the call takes place before the elaboration of the package body (see 3.9).

Example of a package:

 package RATIONAL_NUMBERS is 
 type RATIONAL is
 record
 NUMERATOR : INTEGER;
 DENOMINATOR : POSITIVE;
 end record; 
 function EQUAL(X,Y : RATIONAL) return BOOLEAN; 
 function "/" (X,Y : INTEGER) return RATIONAL; -- to construct a
 rational number
 function "+" (X,Y : RATIONAL) return RATIONAL;
 function "-" (X,Y : RATIONAL) return RATIONAL;
 function "*" (X,Y : RATIONAL) return RATIONAL;
 function "/" (X,Y : RATIONAL) return RATIONAL;
 end; 
 package body RATIONAL_NUMBERS is 
 procedure SAME_DENOMINATOR (X,Y : in out RATIONAL) is
 begin
 -- reduces X and Y to the same denominator:
 ...
 end; 
 function EQUAL(X,Y : RATIONAL) return BOOLEAN is
 U,V : RATIONAL;
 begin
 U := X;
 V := Y;
 SAME_DENOMINATOR (U,V);
 return U.NUMERATOR = V.NUMERATOR;
 end EQUAL; 
 function "/" (X,Y : INTEGER) return RATIONAL is
 begin
 if Y> 0 then
 return (NUMERATOR => X, DENOMINATOR => Y);
 else 
 return (NUMERATOR => -X, DENOMINATOR => -Y);
 end if;
 end "/"; 
 function "+" (X,Y : RATIONAL) return RATIONAL is ... end "+";
 function "-" (X,Y : RATIONAL) return RATIONAL is ... end "-";
 function "*" (X,Y : RATIONAL) return RATIONAL is ... end "*";
 function "/" (X,Y : RATIONAL) return RATIONAL is ... end "/"; 
 end RATIONAL_NUMBERS; 

References: declaration, declarative part, elaboration, and 3.9, exception, exception handler, name, package specification, program unit, program_error exception, sequence of statements, subprogram, variable, visible part.

Rationale references: 9.3 Technical Issues, 10.5.3 (Ch 10 Separate Compilation) Treatment of Package Bodies

Style Guide references: 2.1.7 Pagination, 3.3.4 Program Unit Body Header, 4.1.1 Separate Compilation Capabilities, 4.2.1 Minimization of Interfaces, 4.3.1 Using Exceptions to Help Define an Abstraction, 5.1.4 Naming End Statements, 5.9.1 Unchecked Conversion

[INDEX][CONTENTS]


[Ada Information Clearinghouse]

Address any questions or comments to adainfo@sw-eng.falls-church.va.us.

AltStyle によって変換されたページ (->オリジナル) /