|
Boost Users : |
From: Eric Niebler (eric_at_[hidden])
Date: 2008-06-04 13:18:36
Joel FALCOU wrote:
>> Yes, in proto v4 contexts are not necessary. They can, in some
>> circumstances, be easier to work with then transforms, so I don't plan
>> to remove them. They may even be better at compile time.
> Make sense indeed. It may solve my other problem then.
> I need to perform SIMD computation onto my matrix element. For scalar,
> proto provided the appropriate overload for let's say +,-,*,/ and so on.
> I think hat using visitor may solve the problem of selecing the proper
> form of operation on the fly.
I'm not sure how the data parameter figures here. Wouldn't the semantic
action be conditioned on the expression type? E.g., when an expression
is a binary +, do the binary + action. For that, you'd just use a proto
grammar decorated with transforms, and not involve the data parameter at
all.
>> There are non-trivial changes, yes. Most significantly, the protocol for
>> implementing custom transforms has changed. Also, a bunch of functions
>> and types have been renamed as a result of review feedback.
> So, I better change now and adapt my code ?
Better IMO to wait until v4 is finished and committed to trunk.
> How can the v4 be downloaded ?
It's in boost's subversion repository under the branches/proto/v4 directory.
>> Not sure what you mean. Can you give an example?
> I had the impression that terminal helds value by reference until
> it get transformed and turne dinto value.
You can certainly write a transform that turns terminal references into
values, but that's not the default behavior.
Consider the following program that promotes int terminal to longs and
leaves all others as-is:
#include <cstdio>
#include <boost/proto/proto.hpp>
namespace proto = boost::proto;
using proto::_;
struct Promote
: proto::or_<
proto::when<
proto::terminal<int>
, proto::terminal<long>::type(proto::_value)
>
, proto::terminal<_>
, proto::nary_expr<_, proto::vararg<Promote> >
>
{};
int main()
{
int i = 0;
proto::terminal<int &>::type _i = {i};
std::printf("%s\n", typeid(Promote()(_i + 3.14)).name());
}
On MSVC-8, it prints:
struct boost::proto::exprns_::expr< struct boost::proto::tag::plus,
struct boost::proto::argsns_::list2< struct boost::proto::exprns_::expr<
struct boost::proto::tag::terminal, struct
boost::proto::argsns_::term<long>,0>, struct
boost::proto::exprns_::expr< struct boost::proto::tag::terminal, struct
boost::proto::argsns_::term<double const &>,0> const &>,2>
Note that the long is held by value (because that's what I specified),
and the double is still held by reference (because I didn't associate
any transform with double terminals).
>> Absolutely. A proto transform *IS* a semantic action.
> Ok then, the arguments are clear now :)
-- 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