On 11/18/2010 6:09 AM, Thomas Heller wrote:
> Ok ... I implemented let!

You've been busy. :-)

> Here goes the renumbering example:
> http://codepad.org/K0TZamPb
> 
> The change is in line 296 rendering RenumberFun to:
> struct RenumberFun
>   : proto::fold<
>         _
>       , make_pair(fusion::vector<>(), proto::_state)
>       , let<
>             _a(Renumber(_, second(proto::_state)))
>           , make_pair(
>                 push_back(
>                     first(proto::_state)
>                   , first(_a)
>                 )
>               , type_of<second(_a) >
>             )
>         >
>     >
> {};
> 
> The implementation of let actually was quite easy ... here is how it works:
> 
> let<Locals, Transform> is a transform taking definitions of local variables 
> and 
> the transform these locals will get applied to.
> A local definition is in the form of: LocalName(LocalTransform)
> If the specified transform has LocalName embedded, it will get replaced by 
> LocalTransform.

Unfortunately, this doesn't actually solve the reevaluation problem ...
it just hides it. If "_a" gets replaced eagerly everywhere with
"Renumber(_, second(proto::_state))", then that transform will actually
get run every time. What I want is a way to evaluate the transform,
store the result in a temporary, and have "_a" refer to that temporary.
It's REALLY hard. The let context needs to be bundled with the Expr,
State, or Data parameters somehow, but in a way that's transparent. I
don't actually know if it's possible.

-- 
Eric Niebler
BoostPro Computing
http://www.boostpro.com
_______________________________________________
proto mailing list
proto@lists.boost.org
http://lists.boost.org/mailman/listinfo.cgi/proto

Reply via email to