- 
A package_declaration or generic_package_declaration requires a
completion (a body) if it contains any declarative_item that requires a
completion, but whose completion is not in its package_specification.
Static Semantics
 
- 
The first list of declarative_items of a package_specification of a
package other than a generic formal package is called the visible part
of the package. The optional list of declarative_items after the
reserved word private (of any package_specification) is called the
private part of the package. If the reserved word private does not
appear, the package has an implicit empty private part.
- 
An entity declared in the private part of a package is visible only
within the declarative region of the package itself (including any child
units -- See section 10.1.1 Compilation Units - Library Units. In contrast, expanded names denoting entities
declared in the visible part can be used even outside the package;
furthermore, direct visibility of such entities can be achieved by means
of use_clauses, See section 4.1.3 Selected Components, and See section 8.4 Use Clauses.
Dynamic Semantics
 
- 
The elaboration of a package_declaration consists of the elaboration of
its basic_declarative_items in the given order.
 NOTES
 
 
- 
(1) The visible part of a package contains all the information that
another program unit is able to know about the package.
- 
(2) If a declaration occurs immediately within the specification of a
package, and the declaration has a corresponding completion that is a
body, then that body has to occur immediately within the body of the
package.
Examples
 
- 
Example of a package declaration:
- 
package Rational_Numbers is
 
- 
type Rational is
   record
      Numerator   : Integer;
      Denominator : Positive;
   end record;
- 
   function "="(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 Rational_Numbers;
 
- 
There are also many examples of package declarations in the predefined
language environment, See section A Predefined Language Environment (normative).