Boost logo

Boost :

From: Paul Mensonides (pmenso57_at_[hidden])
Date: 2004-03-04 20:51:45


> -----Original Message-----
> From: boost-bounces_at_[hidden]
> [mailto:boost-bounces_at_[hidden]] On Behalf Of Jonathan Turkanis

> > When you pass EMPTY() as an argument to IF, it expands to nothing
> before the
> > replacement list is rescanned, yielding:
>
> Somehow I thought EMPTY() would be lazier. I guess it can't
> be that smart -- it wouldn't know how lazy to be.

You'd be surprised. :) Chaos can do things very similar to this.

#include <chaos/preprocessor/punctuation/comma.h>
#include <chaos/preprocessor/recursion/expr.h>
#include <chaos/preprocessor/recursion/rail.h>

#define RCOMMA() CHAOS_PP_RAIL(CHAOS_PP_COMMA)()

#define A(x) B(x)
#define B(x) C(x)
#define C(x) D(x)
#define D(x) x

A(CHAOS_PP_COMMA()) // error

CHAOS_PP_EXPR(CHAOS_PP_WALL( A(RCOMMA()) ) // ,

Further, Chaos can count the number of scans that the argument x undergoes, and
then delay an invocation until just before the last scan:

#include <chaos/preprocessor/arithmetic/dec.h>
#include <chaos/preprocessor/recursion/delay.h>
#include <chaos/preprocessor/recursion/delve.h>

#define AF CHAOS_PP_HALT( A(CHAOS_PP_DELVE()) )

A( CHAOS_PP_DELAY(CHAOS_PP_DEC(AF), CHAOS_PP_COMMA)() ) // ,

Of course, this is all irrelevant in this case anyway because IF is already lazy
in Chaos:

#include <chaos/preprocessor/facilities/empty.h>
#include <chaos/preprocessor/control/if.h>

#define PARAM(has_param) \
    CHAOS_PP_IF(has_param)( \
        typename Param, CHAOS_PP_EMPTY() \
    ) \
    /**/

> > #define PARAM(has_param) \
> > BOOST_PP_IF( \
> > BOOST_PP_IDENTITY(typename Param), \
> > BOOST_PP_EMPTY \
> > )() \
> > /**/
> >
> > // or:
> > // #define PARAM(has_param) \
> > // BOOST_PP_EXPR_IF(has_param, typename Param) \
> > // /**/
>
> I like the first better because it's self-contained.

I prefer the second in most cases because it requires the use of less
primitives.

> Thanks for your patience with my preprocessor naïveté.

No problem at all.

Regards,
Paul Mensonides


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