"Even to fix this like you suggest, by making the hash-to-a-symbol function customizable, you only get to have one function"
I'm not sure I follow. I was thinking, for example, that defgeneric would take an optional arg that is type by default. So for example if you want an unserialize generic function, where all serialized types are lists, the function you pass in may be car. Or am I misunderstanding your objection?
Sure, that's what I thought you were saying. ^_^ What I'm trying to say is that, no matter whether the argument is 'type or 'car or something else, once you decide what it is, you've limited the cases that an extension can test for. Someone loading a library and wanting to write an extension for it is limited based on an assumption the library creator made, in a way that they aren't limited when using 'extend.
I'm finding your pickle idea sort of intriguing. What if there were only a single pickle function (or one per defgeneric), which was extensible, and then selecting a method worked by trying to convert the arguments over as little pickle-distance as possible before getting to something that could be matched to a parameter list? Hmm, what I mean is something like this:
To see if a multimethod can be called without pickling:
If the actual arguments match exactly one parameter list, yes.
If they match none, no.
If they match two or more parameter lists, there's an error.
To call a multimethod:
For N = 0 to infinity...
For each choice of N argument indices, allowing duplicates...
The pickled arguments are the arguments after pickling each
chosen index, pickling multiply chosen indices multiple
If any of the arguments couldn't be pickled that many times, try
the next choice of N indices instead.
If the multimethod can be called with the pickled arguments
without pickling further, keep track of these pickled
If we had no legal choices during our loop, there's an error.
If we've kept track of more than one callable pickle combination,
there's an error.
If we've kept track of exactly one, make the call and stop.
This is rather horribly inefficient, but hopefully it gets my idea across.
Despite the fact that I'm bringing up this idea, I'm not sure I agree with it. Who's to say that two picklings of the first argument is a more extreme case than one pickling of the second argument? It's just a thought, I guess.