
Maurizio Vitale wrote:
Eric Niebler <eric@boost-consulting.com> writes:
Maurizio Vitale wrote: <snip>
My mental model was: - proto::deep_copy traverse the expression top-down replacing references with value. Actually, bottom-up, but yes references are replaced with values.
It is probably terminology, but the following seems top-down to me: you're asked to deep-copy an expression and you assemble an expression which has the same shape (tag and argcount) of the original and as children the result of recursive evaluations of deep-copy on the children.
Just terminology. You recurse all the way down to the leaves, deep-copy them and store the results by-value in new parent nodes, all the way back up to the root. So the first deep-copy is done to the leaves -- hence bottom-up. <snip>
I guess my question is what is the difference between:
struct lambda_domain : domain<generator<lambda_expression> > {}; auto expr = deep_copy(_1 + 42);
and:
auto expr_1 = _1 + 42; in the case where the generator you provided is used
Aren't expr and expr_1 exactly the same?
Exactly the same, yes.
How this helps is that as phoenix expressions are being built, the phoenix generator will ensure that all the nodes are held by-value. There will never be a need for the user to deep_copy phoenix expressions explicitly -- it's done piecemeal by phoenix. So function<> is passed an object that does not need to be deep-copied.
I see this difference now and understand the reasons behind your suggestion. Thanks for the explanation,
No problem. -- Eric Niebler Boost Consulting www.boost-consulting.com The Astoria Seminar ==> http://www.astoriaseminar.com