Boost logo

Boost Users :

Subject: Re: [Boost-users] [qi][lambda] Get wrong reaction of the qi::rule if I use lambda for the action
From: Thomas Heller (thom.heller_at_[hidden])
Date: 2011-08-24 04:52:13


On Monday, August 15, 2011 01:11:04 PM boost_mailinglist_at_[hidden] wrote:
> Hello,
>
> if I execute the following example, I get the following output "The bad
> one The good one a" but I only expected "The good one a".
>
> Why does it happens? Boost 1.47.0 was used.

Reformatting code to explain the effect ...

> #include <boost/config/warning_disable.hpp>
> #include <boost/spirit/include/qi.hpp>
> #include <boost/lambda/lambda.hpp>
>
> #include <iostream>
>
> int main()
> {
> using boost::spirit::qi::char_;
> using boost::spirit::qi::parse;
>
> char const *first = "{a}", *last = first + std::strlen(first);
>
> parse(
> first
> , last
> , '{' >> char_("a")
> [std::cout << "The good one " << boost::lambda::_1 << '\n']
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
This will be evaluated eagerly and print "The good one " at rule construction
time and return std::cout again ....
                                           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
... to be picked up the operator overloads of the lambda library to create a
lazy function object (aka lambda)
                                       
> | char_("b")
> [std::cout << "The bad one " << boost::lambda::_1 << '\n']

Same here.

> >> '}'
> );
>
> return 0;
> }

P.S.: Use phoenix for maximum satisfaction. Same rules apply.


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