
-----Original Message----- From: boost-bounces@lists.boost.org [mailto:boost-bounces@lists.boost.org] 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