Boost logo

Boost :

From: Markus Werle (numerical.simulation_at_[hidden])
Date: 2008-03-15 08:28:16


Hi!

This is a proposal for extra text which might have helped me to catch
some things right from the beginning:
 
Section "Accessing Children Nodes":
Subsection "Expression Nodes as fusion sequnces"
After "... arguments in order"
please insert an improved version of the following
paragraph (intended for first-contact-to-proto people like me)

---
Note that in C++ operators are nothing else but special syntax for
operations that can be written as function calls, e.g. a+b is 
equivalent to binary_plus(a, b). Proto "thinks" of operators 
in this way and - as introduced above - uses a type representation
of the form
  expr<tag::binary_plus, typeA, typeB>  
This is why function calls are nothing special to proto and
and are handled in analogy to operators:
For function calls the type representation has a tag tag::function
and the type of function is stored as extra template argument, so you
obtain type representations of the form
  expr<tag::function, typeFunction, typeA, typeB> 
for a function call Function(A, B).
So if a compile time algorithm in proto needs only access to the 
types of the arguments and not to the type of the function,
the first argument has to be removed from the sequence.
We will come back to this in a second:
[Then show the example and then in the explanation add:]
What happens during compilation with "fun(1, 2, 3, 4)"? 
The type of fun is in namespace proto, so it is "tainted" with Proto-ness
exactly like _1 in the examples above.
Similar to _1 + 2, which has a return type of expr<tag::binary_plus, ....>
;-)
\footnote{Once in a time binary operator+ was tagged tag::plus, which led to 
trouble for the tag name of unary operator+. A lot of crazy proposals for
the tag name were made, now we simply use tag::binary_plus and
tag::unary_plus, no further discussions needed} 
;-)
the call fun(...) has a return type of expr<tag::function, 
PUT_SOME_CODE_HERE, ....>
The integers are automatically wrapped in terminal<int>s. 
That's why proto is so cool.
Since we are only interested in the arguments of the function call and 
already know that expression nodes are valid Fusion sequences and know 
that the first element in the fusion sequence is the function type, namely 
terminal<fun_t>::type alias expr<tag::terminal, bla bla>, we use a compile
time algorithm which drops the first element from the list before pushing 
the result through other very useful algorithms of boost::fusion -
in this example for_each and transform 
(Did we already mention that you are lost with proto if you do not
know fusion?)
-----------------------------
Markus

Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk