libraries and environments

Jonathan S. Shapiro jsshapiro@earthlink.net
Thu, 7 May 1998 10:37:22 -0400


I find myself writing a depressing number of library routines that
take the same three or four capability registers as arguments.  In
most cases, these registers hold things like the active domain key, a
schedule key, or a space bank key.

The register positions of these keys seem in practice fixed by
convention -- the constructor/factory sets things up a certain way,
and the process tends to leave them alone because it needs them
frequently.

The dependency on these keys is so pervasive, and the practice of
passing them explicitly is so distracting, that I am considering
introducing the notion of a "library environment" -- a library can
document the set of capabilities that it expects will be sitting in
key registers and where those capabilities live, and is entitled to
assume that the caller will arrange this before invoking the library
routine.

For the moment, the capabilities I have in mind to include in the
"library environment" are as follows:

	Register	Capability
	0		zero number key (hardwired)
	1		constituents node key
	2		domain key to self
	3		schedule key
	4		space bank key

	31		resume key to domain caller

Most libraries will not require the last one, since in most cases they 
do not return directly to the caller.

Applications that do not use such libraries need not maintain these
register conventions.

In cases where non-conventional choices of these values might be
desirable, the library interface can define an "extended" version of
the library routine, or the user can cook the environment
appropriately before performing the call to the library.

Does this seem unwise?

Would it be better to place the schedule key in a well-defined
constituent slot, on the theory that it is mostly used during startup
and initialization?

I am tempted NOT to include the space bank key, as the source of space 
is something one might want to control carefully.


shap