Phillip J. Eby wrote:
> At 02:15 PM 4/6/2006, Guido van Rossum wrote:
>> On 4/6/06, Phillip J. Eby <[EMAIL PROTECTED]> wrote:
>> > I don't want to discourage people from working out their own ideas,
>> > but a lot of the stuff that's being discussed here about protocol
>> > adaptation is already implemented in PyProtocols.
>>
>> That's great. I believe that if we derive things from first principles
>> here and arrive at the same choices as PyProtocols, we haven't wasted
>> anybody's time;
> 
> I agree; that's why I said "I don't want to discourage people from 
> working out ... ideas".  I just wanted to point out that for those who 
> prefer to learn from worked-out examples, there are some available.  One 
> reason I like to steal designs from *built* systems is that making 
> something real forces lots of tradeoffs into the open, that don't come 
> up when you're just brainstorming.
> 
> That having been said, please consider this a "spoiler warning": the 
> rest of this message reveals where I think you're all going to 
> eventually end up.  If it'll spoil anyone's fun and/or learning to know 
> this ahead of time, don't read the rest of this message.  :)
> 
> Hint: premature optimization is the root of all evil. I was actually 
> trying to hint in my previous message that it would be valuable to learn 
> from PyProtocols' example by *not* repeating it!  I was not suggesting 
> that PyProtocols is a model to which you should all aspire, but rather 
> consider why I wish I hadn't bothered to do it in the first place!

I've been stealing liberally from PyProtocols all along, usually trying to 
grasp ways to take *concepts* from it that I liked, and turn them into 
something that seemed *usable* (with aesthetics playing a large part in that).

That's why one of the first things I hit on in rereading PEP 246 was "hang on, 
why are we use a pair of ad hoc protocols to build an adaptation system"? And 
lo and behold, PyProtocols had a much easier to use system based on concrete 
protocol objects, where you manipulated the target protocol directly.

And my last message about adaptation, which was a (massively) simplified 
version of some of the ideas in PyProtocols, let me understand how 
transitivity would apply in a generic function context: you have function_A 
with a certain signature, and existing operations and function_B that can be 
implemented in terms of function_A. All there then needs to be is a way to 
tell function_B about it:

   @function_A.when_specialized
   def notify_function_B(signature, specialization):
       # Give function B a new specialization
       # based on the specialization in A
       # If the signatures are the same, then
       # we can just pass the info along
       function_B.specialize(signature)(specialization)


I have no idea whether providing a mechanism for that is a good idea or not, 
but the important point is that it covers the last thing that I understood how 
to do with protocols, but not with generic functions. And given that *normal* 
functions are already in the language as a fundamental building block, then it 
makes a lot of sense to explore how to make them generic.

I like being able to use 'signature' and 'specialization' as the terms, too, 
as they describe exactly what's going on. Further, if all builtin function 
objects (including C function descriptors and method wrappers) were 
potentially generic, then it would be possible to write:

@specialize(str).for_signature(SomeClass)
def str_SomeClass(obj):
     return obj.stringify()


The use of the "specialize" function (rather than invoking the method 
directly) then means that arbitrary callables can support specialization by 
defining it as something like:

def specialize(obj):
     return obj.__call__

@specialize.for_signature(type(specialize))
def specialize_function(func):
     return func

Cheers,
Nick.

-- 
Nick Coghlan   |   [EMAIL PROTECTED]   |   Brisbane, Australia
---------------------------------------------------------------
             http://www.boredomandlaziness.org
_______________________________________________
Python-3000 mailing list
Python-3000@python.org
http://mail.python.org/mailman/listinfo/python-3000
Unsubscribe: 
http://mail.python.org/mailman/options/python-3000/archive%40mail-archive.com

Reply via email to