|
Boost : |
From: Joel de Guzman (joel_at_[hidden])
Date: 2008-03-25 17:54:38
Hi,
I'm sorry if this is very late. This month has been a whirlwind
for me. So many things happening.
***I vote to accept Proto.***
- What is your evaluation of the design?
Proto is very well designed. I've seen it progress through the
years. It's very mature and stable now. I've been using it as
early as 2005 as a Spirit-2 core library. Spirit-2's design
and evolution somehow influenced Proto's design. I'm very happy
with Eric's design decisions.
Some history...
Eric and I had our share of squabbles in the past ;-) related
to how I expected Proto to be. I knew from the start that I
needed something like it. Joao Abecasis, a Spirit developer,
started one like it, from my urging. Fusion was developed,
in part, due to the need for manipulation of heterogeneous
data structures, specifically for spirit: syntax trees.
I recall that our biggest disagreement, and one that we
resolved soon enough, was my need for flattened sequences.
Eric insisted on presenting the results with no flattening,
I wanted flattening. For example, I wanted:
a >> b >> c >> d
to be a flattened fusion sequence, not a tree. I was reluctant
to have Spirit go through a 2-step process that necessitated
a conversion from a tree to a fusion-sequence:
proto-tree-->fusion-sequence
I had code that didn't use Proto, that produced tight code
and fast compile times. The challenge was for Eric to beat
that or at least come close to its performance. I wanted to
take advantage of fusion algorithms to *efficiently*
iterate over the sequence.
At first, this lead to the development of segmented fusion
iterators. Eric actually implemented this:
http://lafstern.org/matt/segmented.pdf into Fusion!
It was OK and efficient at runtime. Unfortunately, compile
time suffered considerably.
Our endless discussions culminated with:
http://article.gmane.org/gmane.comp.parsers.spirit.devel/2765
Seems some folks were tuning in to our discussions.
The C++ version of "Scrap Your Boiler Plate", a very
powerful, well studied and widely used design pattern
for generic traversal from the Haskell world:
http://portal.acm.org/citation.cfm?id=1159861.1159871
references Eric's post above.
So far so good, yet, SYB ("Scrap Your Boiler Plate")
was not available in a mature form in C++ yet. This then,
again, lead to Dan Marsden's proposed traversal library.
What Eric ended up doing was to provide a zero-overhead
tree structure that's converted very efficiently to a
flattened fusion sequence. It was as fast as my non-proto
Spirit2 implementation and with some compile time performance
hit.
In due time, I'll be using Dan traversal library. At any
rate, Eric's intuition to not flatten the trees is
dead-on correct. It's the right approach. I'm glad that
it influenced interesting solutions to interesting
generic programming problems.
I was happy :-) Proto proved it's worth.
Oh, there were more disagreement on things big and small.
Development happened in an evolutionary manner spanning
years. If you guys are interested in what transpired, it's
all archived in the Spirit-devel list. I gave him a very
tough time :-) The space here won't do justice to what
actually happened, nevertheless, I already did my review
a long time ago, spaning years. In the end, Eric
pulled it all through. I gave him a very tough time :-)
- What is your evaluation of the implementation?
A+
- What is your evaluation of the documentation?
A+
- What is your evaluation of the potential usefulness of the library?
Oh man!
- Did you try to use the library? With what compiler? Did you have any
problems?
Yes. With all compilers required by Spirit. No problems.
- How much effort did you put into your evaluation? A glance? A quick
reading? In-depth study?
Many years of study; from its inception.
- Are you knowledgeable about the problem domain?
Yes. very.
Regards,
-- Joel de Guzman http://www.boost-consulting.com http://spirit.sf.net
Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk