>From: John Cowan <xxxxxx@mercury.ccil.org>
Subject: Re: New release of SRFI 114 with implementation
Date: Wed, 4 Dec 2013 15:49:46 -0500
>> 2. Optional comparator in comparison predicates. The rationale of
>> allowing it is "there is no comparator for comparators, so there is
>> no ambiguity", but why not? There won't be a portable way, but some
>> implementations may allow it.
>
> SRFI 67's approach is to allow only two objects for =? and friends;
> there are another set of predicates which accept two or more arguments
> and require a comparator. That seemed un-Schemely to me. In any case,
> if either an explicit comparator or the default comparator is able to
> compare comparators, the user can always pass it by default. The only
> thing that doesn't work is comparing comparators *implicitly* using the
> default comparator.
Right. And the current description doesn't prohibit default-comparator
to compare comparators. So if you get some arbitrary Scheme objects
and want to apply =? etc., you have to pass the comparator argument
explicitly anyway. You can omit the comparator only when you're
absolutely sure the first argument isn't a comparator. Thus I feel
that omitting the explicit comparator isn't that useful, and it isn't
worth regarding to the risk of forgetting the possibility of obj1
happening to be a comparator (it would make a hard-to-reveal bug).
>> 3. Disjoint comparator type. I have a mixed feeling on it. It would
>> be convenient to have comparator? work, and it might be necessary
>> to overload some procedures such as 'set', which can take either a
>> comparator or equality predicate. OTOH, having a disjoint type just
>> to bundle some procedures seems overkill in Scheme---it smells more
>> like class-based OO language, in which people always need to pass an
>> instance of a class where Lispers would just pass a closure.
>
> That was my original design, to have a closure which would accept a
> symbol argument saying what to do. But there are several disadvantages
> to such "poor man's objects":
I agree with those disadvantages, and I'm not saying the standard
should use closures. My point is to allow implementations to use
closures if it wants to. Or to allow a 'map' with suitable entries
i.e. in Clojure notation, something like
{:type? type-pred, :equal? equal-proc, :hash hash-proc}
Certainly having `comparator?' is an advantage, and implementations
that choose closures would have a difficulty there. However, I've
fancied "procedure attributes" before, which is immutable attributes
one can query to a procedure object. If an implementation have that
kind of extension, it can provide `comparator?' as well. And for
the implementation that allow maps, `comparator?' can just check
whether it has suitable entries. Anyway, we can leave implementations
to provide a reasonably reliable `comparator?' without requiring
comparators to be a separate type. So the API can be intact.
--shiro