Protocol library as alternative to refinements (Russell Leggett)

Russell Leggett russell.leggett at
Tue Oct 22 13:07:10 PDT 2013

On Tue, Oct 22, 2013 at 2:34 PM, Benjamin (Inglor) Gruenbaum <
inglor at> wrote:

> On Tue, Oct 22, 2013 at 8:10 PM, Russell Leggett <
> russell.leggett at> wrote:
>> > Revised algorithm:
> > 1. If receiver has protocol method symbol as a property, use that as
> override.
> > 2. Try to use protocol methods - start by checking receiver type
> mapping, then check up type hierarchy for any matches, and finally if no
> matches, use the default if defined.
> > 3. Finally, if no matches and no default, check prototype for method of
> same name.
> > Does that sound better?
> Much :)

Actually, let me revise 3:
3. Finally, if no matches and no default, attempt to call a method of the
same name (not affected by variable name or aliasing) on the receiver.

Something like this:

    const P = new Protocol("foo");

    // naive, non-native implementation of would be something
    function foo(...args){
        if( in this){
            //P.symbols holds a symbol for each method
            return this[](...args);

        }else if(P.contains(Object.getPrototypeOf(this))){
            //contains and lookup might be backed by a weakmap or something,
            //but it would also need to go up the type chain
            let myFoo = P.lookup(Object.getPrototypeOf(this)).foo;
            return this::myFoo(...args);

        }else if(P.getDefaults().hasOwnProperty("foo")){
            let defaultFoo = P.getDefaults().foo;
            return this::defaultFoo(...args);


If this seems acceptable, I'll update the gist.

- Russ
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <>

More information about the es-discuss mailing list