Cleanup Issue IN-PACKAGE-FUNCTIONALITY

Status
proposal MAR89-X3J13 passed, as amended, Mar 89 X3J13
Category
CHANGE
References
IN-PACKAGE (p182-183)
Related issues
DEFPACKAGE, (passed), COMPILE-FILE-SYMBOL-HANDLING

Problem Description

There are two typical uses for IN-PACKAGE -- to define/create a package and to select a package. The fact that these two purposes have been given to the same function has led to reduced error checking.

A more general problem is that the "Put In Seven Extremely Randoms" convention described in CLtL is now recognized by many people as being unsatisfactory for both package definition and package selection. The DEFPACKAGE macro provides a much cleaner mechanism for package definition, but there is still a need for a convenient way to select a package that has well-defined compilation semantics.

Proposal (MAR89-X3J13)

Change IN-PACKAGE from a function to a macro:

IN-PACKAGE name [macro]

This macro causes *PACKAGE* to be set to the package named NAME, which must be a symbol or string. An error is signalled if the package does not already exist. Everything this macro does is also performed at compile time if the call appears at top-level.

Remove the second paragraph of section 11.7 in CLtL. (This includes the requirement for special compile-time treatment of the various package functions.)

Rationale

This could allow improved error checking and modularity, with only minimal loss of functionality.

Making IN-PACKAGE a macro rather than a function means that there is no need to require COMPILE-FILE to handle it specially. Since DEFPACKAGE is also defined to side-effect the compilation environment, there is no need to require any of the package functions to be treated specially by the compiler.

The language in section 11.7 of CLtL puts the burden on implementations of ensuring that all symbols in a file which is compiled and loaded end up in the same package that they would if the source file were loaded interpretively. No implementation can possibly meet this requirement because, in general, the runtime behavior of the program cannot be predicted by the compiler.

Current Practice

Probably no one implements this behavior exactly since it's an incompatible change to CLtL.

Cost to Implementors

The IN-PACKAGE macro can be implemented trivially by using EVAL-WHEN in its expansion:

    (defmacro in-package (name)
        `(eval-when (eval compile load)
	     (setq *package*
	           (or (find-package ',name)
		       (error "Package ~s does not exist." ',name)))))

The changes required to COMPILE-FILE to remove the magic treatment of the package functions are also likely to be small.

Cost to Users

In most cases, minor syntactic changes to some files would be necessary. Programmers that are now using the "Put In Seven Extremely Randoms" convention will probably find it straightforward to convert their code to do a DEFPACKAGE followed by a IN-PACKAGE.

Cost of Non-Adoption

The specification of COMPILE-FILE will be much more difficult to understand.

The standard will require compilers to solve the halting problem.

Benefits

Modular package declarations would be encouraged and errors due to demand-creation of packages would be easier to detect.

The specification of COMPILE-FILE will be simplified.

There will be a clear statement of the requirements for program conformance, as relating to usage of packages.

Aesthetics

The fact that IN-PACKAGE is currently ambiguous about intent (whether the package should exist already or not) is clearly not aesthetic. Removing it can't be any worse.

The fact that the currently stated requirements for handling of the package functions by the compiler are not implementable is clearly not aesthetic.

Discussion

The dual use of IN-PACKAGE has not been helpful and is confusing.

This is an incompatible change.

KMP's notes of the Mar 89 X3J13:

On Tuesday, we took a straw poll. 0 opposed both proposals. 15 liked NEW-MACRO. 7 liked SELECT-ONLY. ``Keeping IN-PACKAGE makes no difference to compatibility.'' --Moon Pitman moved to amend this to say "deprecate" instead of remove. The motion to amend failed 3-N. The NEW-MACRO proposal passed unamended 12-4.

On Thursday, Aaron Larson and JonL asked that the issue be reconsidered. The motion to reconsider passed N-1. There was a motion to rename the SELECT-PACKAGE which we'd voted in to IN-PACKAGE -- so that the compatible syntax (IN-PACKAGE "FOO") would work in CLtL and ANSI CL. Steele requested verbal clarification that we were not trying to solve the ``dusty file'' problem but rather to make it possible to write new code that worked in old and new situations -- it was agreed that this was a correct characterization of the proposal. JonL's amendment passed 13-1. Then the amended proposal was voted in 14-0.

The net effect is that NEW-MACRO passed with the name of SELECT-PACKAGE changed to IN-PACKAGE.

----- LMM added 19-Mar-90: (in-package foo) is now legal (but illegal CLtL) (in-package 'foo) is now not legal (but legal CLtL) (in-package "FOO") is now legal (and was in CLtL too)

Edit History