|
Proto : |
Subject: Re: [proto] : Proto transform with state
From: Eric Niebler (eric_at_[hidden])
Date: 2010-12-07 14:27:19
On 12/7/2010 3:13 PM, Thomas Heller wrote:
> Eric Niebler wrote:
>> Now they do: T()(e,s,d). Inside T::impl, D had better be the type of d.
>> Nowhere does the _data transform appear in this code, so changing _data
>> to be "smart" about environments and scopes won't save you if you've
>> monkeyed with the data parameter.
>
> Very true. Something like proto::transform_env_impl could help. Introduce a
> new type of primitive transform which is aware of this environment. The
> usual transform_impl can still be used.
> By calling T()(e,s,d) you just create a 2-tuple. The first parameter is the
> state, second data.
> Just thinking out loud here ...
So transform_impl strips the data parameter of the let scope stuff, and
the local variables like _a don't use transform_impl and see the scope
with the locals?
Well, it's not that simple.... Consider:
make< int(_a) >
If make::impl uses transform_impl, it strips the let scope before _a
gets to see the local variables. If this is to work, most of Proto's
transforms must be "special" and pass the let scope through. That means
proto::call, proto::make, proto::lazy and proto::when, at least. But ...
it just might work. Good thinking!
<time passes...>
No, wait a minute. Look again:
struct T : transform<T> {
template<class E, class S, class D>
struct impl : transform_impl<E, S, D> {
// do something with D
};
};
T::impl gets passed D *before* transform_impl has a change to fix it up.
Any existing transform that actually uses D and assumes it's what they
passed in is going to be totally hosed. In order to make existing
transforms let-friendly, they would all need to be changed. That's no good.
Bummer, I was excited for a minute there. :-/
-- Eric Niebler BoostPro Computing http://www.boostpro.com
Proto list run by eric at boostpro.com