Boost logo

Boost :

Subject: Re: [boost] [local] Review (and resignation from review assistant)
From: Joel de Guzman (joel_at_[hidden])
Date: 2011-11-21 09:56:24


On 11/21/2011 10:41 PM, Andrzej Krzemienski wrote:
>>> - What is your evaluation of the design?
>
>> The library is very well designed. The function declaration syntax looks
> a little foreign at first, but it is very easy to get used to.
> Furthermore, error messages are usually able to point you to what you did
> wrong. The fact that you can write the body of the function in plain C++
> code is a major advantage of this library. Some have referred to
> Boost.Bind, Boost.Lambda and Boost.Phoenix as essentially being equivalent
> to this library, but in none of those libraries can you express the body of
> your function in plain C++; one advantage of this is that errors in your
> code result in normal C++ error messages rather than cryptic error messages.
>
> Lorenzo, given this comment by Greg, I do have one more suggestion for
> documentation (or did someone already say it?). Given the heated discussion
> of whether Boost.Bind, Boost.Lambda and Boost.Phoenix are sufficient to
> render Boost.Local unnecessary, perhaps it would be worth to provide a
> comparison of how my code (not too trivial, and not too complex) would look
> in either case. For instance:
>
>
> With C++11 lambdas:
>
> for_each( vec.begin(), vec.end(), []( std::string & n ){ if(n.empty()) n =
> "n/a";} );
>
>
> With Boost.Lambda + Boost.Bind:
>
> for_each( vec.begin(), vec.end(), if_then(boost::bind(&std::string::empty,
> _1), _1 = "n/a") );
>
>
> With Phoenix:
>
> using boost::phoenix::arg_names::arg1;
> using boost::phoenix::if_;
> using boost::phoenix::bind; // right?
>
> for_each( vec.begin(), vec.end(), if_(bind(&std::string::empty, arg1)) [
> arg1 = "n/a" ] );

Better:

  for_each( vec.begin(), vec.end(), if_(empty(_1)) [_1 = "n/a" ] );

> With Boost.Local (Boost.Closure):
>
> BOOST_CLOSURE_PARAMS( std::string & n ) {
> if( n.empty() ) n = "n/a";
> }BOOST_CLOSURE_NAME(replace_empties);
>
> for_each( vec.begin(), vec.end(), replace_empties );
>
>
> Ok, I am not sure if there are no better ways to write it in each variant,
> and I may be biased. I also didn't try to compile the examples. But it
> should give the potential users an overview of options they have.

Yep. This highlights the verbosity well:

  for_each( vec.begin(), vec.end(), if_(empty(_1)) [_1 = "n/a"] );

vs:

  BOOST_CLOSURE_PARAMS( std::string & n ) {
    if( n.empty() ) n = "n/a";
  }BOOST_CLOSURE_NAME(replace_empties);

  for_each( vec.begin(), vec.end(), replace_empties );

Regards,

-- 
Joel de Guzman
http://www.boostpro.com
http://boost-spirit.com

Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk