The expression

    type_expression with local_name { declaration; ... ; declaration }

produces a new type, which is identical to that specified by the
type_expression, except that new components corresponding to the declarations
have been added.  If one of the newly declared identifiers has the same
name and signature as a component in the original type, then that
component is replaced.  The local_name is optional, and may be used
to refer to newly introduced components, or old components which have
not been replaced.  The type

    Short with S { PLUS == S$+ } hide { + }

Is the same as the original type Short, except that the "+" operation
has been renamed as "PLUS".

All components added to the type must have value, function, or type
signature.

As in "let" blocks, declarations are evaluated in the specified order.

The signature of the resulting type is obtained from that of the original type
by first deleting any redefined components, and then adding the new ones.
As for "hide" and "export" constructs, all expressions appearing in the
signature after the deletion step must be signature correct.

Implementation Note:  Run-time forward references to explicit selections
from the local name will generate a (run-time) error.  Other potential
forward references to the local name will generate warnings, but no
run-time checks.

See also: let, hide
