Cleanup Issue SLOT-MISSING-VALUES

Category
CLARIFICATION
References
88-002R p.2-78..79

Problem Description

The document says that all values returned by a SLOT-UNBOUND or SLOT-MISSING method are returned from SLOT-VALUE, SETF, SLOT-BOUNDP, or SLOT-MAKUNBOUND. However, the language mandates particular values to be returned by SETF and by SLOT-MAKUNBOUND, and mandates that SLOT-VALUE and SLOT-BOUNDP return exactly one value. If methods can change this, efficient compilation becomes very difficult.

This is Symbolics issue #19.

Proposal (SPECIFY)

Specify exactly what is done with the values returned from a SLOT-UNBOUND or SLOT-MISSING method, as follows:

If the operation was SETF or SLOT-MAKUNBOUND, the values are ignored.

If the operation was SLOT-VALUE or SLOT-BOUNDP, exactly one value is returned; extra values returned by the method are ignored, and if the method returns no values, NIL is returned.

If the operation was SLOT-BOUNDP and the method returns a value other than NIL, SLOT-BOUNDP might return any object other than NIL that it can validly return; only the truth or falsity of the method's value matters.

Current Practice

It's likely that all CLOS implementations already conform to the proposal, since implementing what the document says would be extremely difficult. I have not actually tested any implementations.

Cost to Implementors

What's proposed is what's easiest to implement.

Cost to Users

None, since it's unlikely that any users would depend on being able to force SLOT-VALUE to return two values, or to force SETF of SLOT-VALUE to return something different from new-value.

Cost of Non-Adoption

CLOS will be seriously difficult to implement correctly.

Performance Impact

Implementing CLOS correctly will cause a serious efficiency impact on SLOT-VALUE if this proposal is not adopted, since it will have to be capable of dynamically deciding at run time to return multiple values.

Benefits

Simpler and more consistent language.

Aesthetics

Simpler and more consistent language.

Discussion

None.

Edit History