On 12/8/2010 5:30 PM, Thomas Heller wrote:
> I don't really now how to do it otherwise with the current design.
> There is really only this part of the puzzle missing. If it is done, we have 
> a working and clean Phoenix V3.
> For the time being, I can live with the workaround I did.
> However, I will focus my efforts of the next days on working out a patch for 
> this to work properly.

I made a simple fix to proto::matches on trunk that should get you
moving. The overloads can still be smarter about sub-domains, but for
now you can easily work around that by explicitly allowing expressions
in sub-domains in your super-domain's grammar. See the attached solution
to your original problem.

Eric Niebler
BoostPro Computing
#include <boost/proto/proto.hpp>

namespace mpl = boost::mpl;
namespace proto = boost::proto;

typedef proto::terminal<int> int_terminal;
typedef proto::terminal<double> double_terminal;

template <typename Expr>
struct actor1;

struct domain1;

struct grammar1
    : proto::or_<
        proto::plus<grammar1, grammar1>
      , int_terminal
      , proto::if_<proto::is_sub_domain_of<proto::domain_of<proto::_>, 

struct domain1
    : proto::domain<
      , grammar1
      , proto::default_domain

template <typename Expr>
struct actor1
    BOOST_PROTO_BASIC_EXTENDS(Expr, actor1<Expr>, domain1)

template <typename Expr>
struct actor2;

struct grammar2
    : proto::or_<
        proto::plus<grammar2, grammar2>
      , double_terminal

struct domain2
    : proto::domain<
      , grammar2
      , domain1

template <typename Expr>
struct actor2
    BOOST_PROTO_BASIC_EXTENDS(Expr, actor2<Expr>, domain2)

actor1<int_terminal::type> t1 = {{0}};
actor2<double_terminal::type> t2 = {{0}};

int main()
  t1 + t1;
  t2 + t2;
  t1 + t2;
proto mailing list

Reply via email to