Boost logo

Boost Users :

Subject: Re: [Boost-users] [Proto] callable_context
From: Eric Niebler (eric_at_[hidden])
Date: 2010-12-11 11:50:30


On 12/10/2010 11:57 AM, Hossein Haeri wrote:
> Dear all,
>
> I am trying to use callable_contexts to evaluate expressions like:
>
> x >> f >> g >> h;
>
> where this would be equivalent to h(g(f(x))). I have derived my
> context from callable_context, and thought I have overloaded for
> relevant tags (terminal and shift_right). GCC 4.5.1 (MinGW32, WinXP,
> SP3) stops with an error message which is cryptic to my current level
> of knowledge about Proto. I guess that's because I haven't done the
> job correctely. For your reference, I have included a copy of my
> program as well as the error GCC gives me in the P.S. section of this
> posting. Any ideas please?

Contexts make life harder, and I hope to deprecate them in the future.
Here's what the solution looks like using transforms:

  #include <boost/proto/proto.hpp>
  #include <iostream>
  namespace proto = boost::proto;
  using proto::_;

  struct add_one_ {
    typedef int result_type;
    int operator()(int i) const {
      return i + 1;
    }
  };

  proto::terminal<add_one_>::type const add_one = {};

  struct GetFun
    : proto::call<proto::_value(proto::_right)>
  {};

  struct EvalStream
    : proto::or_<
          proto::when<
              proto::terminal<_>
            , proto::_value
>
        , proto::when<
              proto::shift_right<EvalStream, proto::terminal<_> >
            , proto::lazy< GetFun(EvalStream(proto::_left)) >
>
>
  {};

  int main()
  {
      // This prints "3"
      std::cout << EvalStream()( 1 >> add_one >> add_one ) << std::endl;
  }

HTH,

-- 
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