Contains definition of the ``proto::lazy<>`` transform.

proto::transform
< lazy<T> >
A PrimitiveTransform that uses ``proto::make<>`` to build a CallableTransform, and then uses ``proto::call<>`` to apply it.

`proto::lazy<>` is useful as a higher-order transform, when the transform to be applied depends on the current state of the transformation. The invocation of the ``proto::make<>`` transform evaluates any nested transforms, and the resulting type is treated as a CallableTransform, which is evaluated with ``proto::call<>``.

For the full description of the behavior of the ``proto::lazy<>`` transform, see the documentation for the nested ``proto::lazy::impl<>`` class template.

`proto::transform_impl`<Expr, State, Data>
see-below

``proto::lazy`<T>::impl<Expr,State,Data>::result_type` is calculated as follows:

- If `T` if of the form `O(A0,…An)`, then let `O'` be `boost::result_of<`proto::make`<O>(Expr, State, Data)>::type` and let `T'` be `O'(A0,…An)`.

- If `T` if of the form `O(A0,…An ...)`, then let `O'` be `boost::result_of<`proto::make`<O>(Expr, State, Data)>::type` and let `T'` be `O'(A0,…An ...)`.

- Otherwise, let `T'` be `boost::result_of<`proto::make`<T>(Expr, State, Data)>::type`.

The result type is `boost::result_of<`proto::call`<T'>(Expr, State, Data)>::type` .

result_type `typename impl::expr_param` `typename impl::state_param` `typename impl::data_param`

``proto::lazy`<T>::impl<Expr,State,Data>::operator()` behaves as follows:

- If `T` if of the form `O(A0,…An)`, then let `O'` be `boost::result_of<`proto::make`<O>(Expr, State, Data)>::type` and let `T'` be `O'(A0,…An)`.

- If `T` if of the form `O(A0,…An ...)`, then let `O'` be `boost::result_of<`proto::make`<O>(Expr, State, Data)>::type` and let `T'` be `O'(A0,…An ...)`.

- Otherwise, let `T'` be `boost::result_of<`proto::make`<T>(Expr, State, Data)>::type`.

``proto::call`<T'>()(expr, state, data)`