[PEAK] PEAK Roadmap Update

Phillip J. Eby pje at telecommunity.com
Wed May 24 01:28:40 EDT 2006

I've finally started using a bit of my spare time towards PEAK development 
again.  If you're subscribed to the source-changes list, you'll have seen a 
bunch of commits lately splitting out peak.util.imports to a new 
"Importing" project, as well as a new "BytecodeAssembler" distribution 
split from RuleDispatch.

Next up is splitting out PyProtocols' class and function decorator features 
into a new "Decorating" project, where they'll be reusable by other packages.

After that, I'll be starting on a new PEAK-Rules project, whose purpose 
will ultimately be to replace both RuleDispatch and PyProtocols, although 
it won't do so immediately.

PEAK-Rules will basically be a ground-up rewrite of RuleDispatch based 
entirely on generic functions, with no interfaces or PEP 246 
adaptation.  This is a reflection of the fact that both Alex Martelli (PEP 
246's primary champion) and Guido have both caught on to the greater power 
of generic functions.  PEPs 245 and 246 (interface syntax and adaptation, 
respectively) have been rejected, and Guido has a simple generic function 
prototype he has implemented for Python 3.0 (coming in a couple of 
years).  You can see Guido's prototype at:


I created an enhanced version of Guido's prototype that actually uses a 
self-bootstrapping set of generic functions to implement generic 
functions.  :)  It is designed to be supremely extensible, such that a 
RuleDispatch-like system can be implemented atop it.  The source of my 
prototype is here:


After doing these, it became clear to me that rather than try to refactor 
RuleDispatch as it is currently built (which was my original plan for 
future enhancements), I would be better off rebuilding it from scratch atop 
a microkernel like this one.  In that way, it will be entirely independent 
of PyProtocols, and I will be able to correct its many design flaws in the 

Specifically, the interface/adaptation/concrete methods approach to 
building RuleDispatch forced a lot of design and implementation compromises 
that I now see are unnecessary if you have generic functions 
available.  For example, there are a lot of kludgy implementations of 
__and__ and __or__ and other binary operations, that would be cleaner if 
they were implemented via generic functions.  Also, the entire method 
combination approach (when/around/before/after/etc.) is terribly kludgy, 
and I have figured out how it can be replaced with a more easily extensible 

Last, and far from least, the dispatch tree building and code generation 
machinery is too hardwired in RuleDispatch; there is no easy way to vary 
that mechanism independent of everything else.  If you want to modify 
anything about a generic function you have to subclass it, whether you're 
just changing the combination rules or you're changing the tree building or 

So, PEAK-Rules will implement these using separate components: Rules, 
RuleEngines, and RuleSets.  RuleSets will hold rules and will be able to 
influence how method combination works.  RuleSets will also be able to hold 
configuration "hints" that can influence how indexing and code generation 
will work.  But the actual indexing and code generation will be controlled 
by RuleEngine objects, which will mostly be invisible to the framework 
user.  Only if you need to create custom implementation strategies will you 
need to work with RuleEngines.

I'm hoping that PEAK-Rules will have a much smaller API footprint than 
RuleDispatch+PyProtocols.  It's possible that the total implementation size 
will be smaller as well, although it's way too soon to tell; I haven't even 
created the project directory yet, just done some design sketches to work 
out how the basic features will work.

I'm really excited about the design, though, because it's *much* more 
orthogonal than the current super-monolithic RuleDispatch 
implementation.  It should be possible to experiment with and test a whole 
lot of stuff without actually introducing the full Python expression and 
indexing support, using just the microkernel features.  And the fact that 
code generation strategies will be equally pluggable means that I'll be 
able to trade off some complexity for flexibility.  That is, rather than 
trying to have the One True Dispatch Algorithm (as RuleDispatch does) that 
wants to be more-or-less-optimal for every possible situation, I'd like to 
make PEAK-Rules able to be tuned for good performance in typical cases, 
with the ability to give "hints" to adjust the chosen algorithms for 
less-typical cases.

Anyway, at this point RuleDispatch and PyProtocols are pretty much 
feature-frozen.  I will still fix bugs, of course, but there aren't going 
to be any new features; such efforts will go into the new package.  It's 
not clear to me yet if PEAK-Rules will offer an Interface type or other 
PyProtocols-like APIs.  To some extent it depends on where the rest of PEAK 
is going.

At some point, peak.events is going to split out into a separate project, 
probably called "Eventual".  It'll have some changes to help it work better 
with Python 2.5.  It'll probably also require the "Contextual" library 
(which is already in SVN).  "Contextual" is a library for dynamic context 
management that will offer an attractive replacement for PEAK's existing 
configuration system.  There may be some interaction between PEAK-Rules and 
Contextual at some point, though I'm not sure how that's going to work yet.

At some point in the indefinite future after all that, Schematic (aka 
peak.schema) will raise its head, as it will depend on at least Contextual 
and PEAK-Rules, and whatever the naming, binding, and storage packages will 
have morphed into by then.  So that stuff should all be ready by the time 
Python 3000 comes out.  :)

So there you are, my roadmap update.  No dates on anything, since this is 
all spare-time stuff for me unless somebody wants to provide funding (hint, 
hint).  ;)  However, I anticipate being able to have a demo-able version of 
PEAK-Rules in June.  It may not have all of the features of RuleDispatch at 
that point, but it should be able to do other things that RuleDispatch 
can't (and won't ever) do.  The "Decorating" (DecoratorTools?) project 
should be out this week or next, as it needs to be done before I can really 
start PEAK-Rules.

More information about the PEAK mailing list