Boost logo

Boost Users :

Subject: Re: [Boost-users] [Proto] Higher order function
From: Eric Niebler (eric_at_[hidden])
Date: 2010-04-27 19:08:28


On 4/27/2010 1:46 PM, Noman Javed wrote:
> Eric Niebler <eric <at> boostpro.com> writes:
>
>> Now Array is a full proto terminal type, and expressions involving them
>> will build expression trees.
>>
> I have tried that Array code, its working. But when I try to print the contents
> of the Array directly through std::cout it gives me errors. Should I need to
> implement a printcontext ?

Your ArrayImpl type needs to be streamable; that is, it needs to define
a stream insertion operator, like operator<<(std::ostream&, ArrayImpl
const&). That's mentioned in the docs.

>> It doesn't look to me like there is anything lazy about apply. So it
>> isn't part of your expression template. Rather, it accepts expressions
>> and an evaluator, and evaluates it.
>>
>> There may be a more elegant solution. What are your evaluators?
>
> The idea is to implement lazy evaluated expressions like e.g
>
> Array<int> res = evaluate(apply(inc,apply(add,apply(dec,data1),data2) ) );
>
> where inc is a user defined increment function or function object
> data1 and data2 are already created Array<int>

IMO, your language could be more expressive.

  Array<int> res = ++( --data1 + data2 );

There's no reason why that can't have the same semantics and efficiency
as what you gave above. If you want the set of operations to be
user-extensible, you can allow additional functions of the form:

  Array<int> res = fun(data1);

The evaluation can be done implicitly by giving Array an user-defined
assignment operator.

I suggest you spend some time with Proto's docs and have a look at the
examples. It'll save you a LOT of time.

-- 
Eric Niebler
BoostPro Computing
http://www.boostpro.com

Boost-users list run by williamkempf at hotmail.com, kalb at libertysoft.com, bjorn.karlsson at readsoft.com, gregod at cs.rpi.edu, wekempf at cox.net