The explanation of * and % is confusing. The SRFI states:
When * is encountered in the definitions below, it is implied that
the asterisk is replaced with a function for the specific collection
and each of the collection's supertypes for which the procedure is
defined. For example, if we had a 'list' flexible sequence
collection, the functions list-contains?,
flexible-sequence-contains?, sequence-contains?, bag-contains? must
all exist, but collection-contains? does not.
But the *-methods seem to be defined for the supertype, not the subtype.
Given that, the above explanation is confusing. Wouldn't it be better to
state:
When * is encountered in the definitions below, it means that the
function exists for the named collection and all of its subtypes.
For example, all bags and subtypes of bag have a *-contains?
function: bag-contains?, sequence-contains?, and even
list-contains?.
Also, I'm not sure whether these functions are supposed to be
polymorphic. I think they are, but the SRFI isn't entirely clear. If so,
please clarify; for example:
Each *-function may be applied to the specific type named or to any
of its subtypes. For example, bag-contains? can find a value in a
sequence, flexible-sequence, or list.
Unrelated to this: The *-remove functions state that they "return two
values." I had to check the reference implementation to confirm that
this means "returns using VALUES." Perhaps the function prototype should
read:
procedure: *-remove-left![!] * => (VALUES % value)
--
Bradd W. Szonye
http://www.szonye.com/bradd