comp.lang.ada
 help / color / mirror / Atom feed
[parent not found: <18077548@jade.UUCP>]
[parent not found: <1701997413@950@ucbvax.Berke>]
[parent not found: <1701997413@576@ucbvax/nerke>]
[parent not found: <306@telesoft.UKE>]
* Ada '88 musings
@ 1985-12-31 21:40 stt
  1986-01-20 17:47 ` Orphaned Response stt
  0 siblings, 1 reply; 7+ messages in thread
From: stt @ 1985-12-31 21:40 UTC (permalink / raw)



Just to get a little meaty technical discussion going...
Here are some proposals for Ada '88, arising from
our use of Ada in building compilers, database managers, etc:

  1)  Support user-defined finalization for
      packages and limited types.
  2)  Support user-defined assignment for limited types.
  3)  Extend identifier visibility rules to eliminate need
      for most "use" clauses.

I consider (1) essential to using Ada for significant
systems programming, anytime multi-access or multi-tasking
exists in the program or the environment (to guarantee files
are closed, buffers are flushed, locks are released, storage is
reclaimed, etc.)

(2) is mostly a syntactic sugar issue, though any language
supporting the notion of abstract types ought to support it.

(3) is probably necessary for the upward-compatible
implementation of (2), to give correct visibility
characteristics to user-defined ":=".


One mechanism for implementing (1) would be as follows:

The "begin" of a declarative part would be extended
as follows:
   [  when end =>  STATEMENT_LIST  ] begin
The statement_list would be executed when the declarative part
is exited for any reason, after waiting for any tasks to complete.
Exceptions raised and not handled in the statement list would
cause the statement_list to be terminated, and the original exiting
action to continue.

In addition, a finalization procedure may be defined for
a limited type, with the following syntax:

    procedure "end"(OBJ: in out LIM_TYPE) is begin  ... end "end";
    
When such a procedure is visible (see discussion of (3) below), then
in addition to waiting for tasks to terminate, a block statement,
subprogram body, or task is not finished until each of the dependent
objects are finalized (by calling "end" on them).

Any exceptions raised and not handled by the "end" procedure
cause the procedure to return and processing continues with the
next "end" procedure.

For limited objects designated by access values, the "end"
procedure may be executed once no references remain, prior
to reclamation of the storage, but after termination of
all task components of the object.

Let me be the first to say that the proposed syntax is pretty
ugly, but user-defined finalization is so important that
in the absence of more creative suggestions, this would still
be worthwhile.

The implementation of (2) is pretty straightforward, stealing all
the rules from user-defined "=", except that the subprogram spec must be
of the form:
   procedure ":="(L : in out LIM_TYPE; R : in LIM_TYPE) is
   begin ... end ":=";

Restricting this to limited types is to eliminate confusion
with the many implicit assignments implied in legal
operations on non-limited types (e.g. aggregates, array assignment,
etc.).  These are the same as the arguments for user-defined "="
being restricted to limited types (with the same holes in the arguments,
presumably).

The problem with (2) is that built-in ":=" is "directly" visible
even when other implicitly defined operations (like "=") are not.
To avoid forcing everybody to "use" the defining package
of a limited type to get visibility on ":=" (or the horrendous
pkg.":="(a, b)), we come to:

The implementation for (3):
Add a third place to search for identifiers after consulting
"direct" visibility and "use" visibility -- "defining-package"
visibility.  Defining-package visibility would mean that
after consulting the "use"d packages, each package in which
the type of a parameter is defined is consulted for a subprogram/operator
definition.  Note that the package of the result-type is NOT included.

In fact, if more than one package is represented among the types
of the parameters, then it is guaranteed that at most one
of them could have visibility to all of the parameter types,
and hence only one of them could possibly provide a definition
for the subprogram/operator.

For example:
    x+y    Assume type of x is pkg_x.type_x and type of y is pkg_y.type_y
           and pkg_y looks like this:
	   
           with pkg_x;
	   package pkg_y is
	       type type_y is new integer;
	       function "+"(a:pkg_x.type_x; b:type_y) return type_y;
           end pkg_y

   Then it should not be necessary to "use" pkg_y for Ada semantics
to resolve "+" in x+y.
This should eliminate most of the need for "use" clauses.

All of these ideas are half-baked, but we still have 2 years
to finish the baking...

Tucker Taft
Intermetrics, Inc.
733 Concord Ave
Cambridge, MA  02138   (617) 661-1840

^ permalink raw reply	[flat|nested] 7+ messages in thread
[parent not found: <690@lll-crg.UUCP>]

end of thread, other threads:[~1986-08-08 10:41 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
     [not found] <679@EDU>
1986-08-07  4:58 ` Orphaned Response richw
     [not found] <18077548@jade.UUCP>
1986-08-08 10:41 ` kern
     [not found] <1701997413@950@ucbvax.Berke>
1986-06-02 19:08 ` GOODENOUGH@
     [not found] <1701997413@576@ucbvax/nerke>
1986-06-02 18:29 ` GOODENOUGH@
     [not found] <306@telesoft.UKE>
1986-03-18 16:55 ` stt
1985-12-31 21:40 Ada '88 musings stt
1986-01-20 17:47 ` Orphaned Response stt
     [not found] <690@lll-crg.UUCP>
1985-07-26 22:35 ` gjs

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