----- Original Message ----- 
From: "Vesa Karvonen" <[EMAIL PROTECTED]>

> The basic idea is that the keywords '__l_paren__', '__r_paren__' and
> '__comma__' could be used in place of '(', ')' and ',', respectively. The
> above example would now become:
>
>   #define ID(x) x
>   ID( __l_paren__                           )
>   ID(             a __comma__ b             )
>   ID(                           __r_paren__ )
>
> and it would expand into:
>
>    __l_paren__ a __comma__ b __r_paren__

I like the idea.  (Though I'd prefer __lparen__ and __rparen__.)  What about
__hash__ and __hashhash__?  It is currently illegal for # to appear in a
function-like macro replacement list unless it leads a parameter.  In which
case, it is the stringizing operator.  So, instead you have to do this...

#define HASH() HASH_I
#define HASH_I #

#define HASH_HASH CAT(HASH(), HASH())

...in order to produce the tokens # and ##.

Commas and parentheses are much more of a problem though, I agree.

Also, and perhaps more importantly than any of these "punctuation" operators:

__newline__

...which would have no effect on compilation but would insert newlines into
preprocessing output.

One question Vesa, what happens here:

#define STRINGIZE(x) PRIMITIVE_STRINGIZE(x)
#define PRIMITIVE_STRINGIZE(x) #x

STRINGIZE(__comma__)           // ?
PRIMITIVE_STRINGIZE(__comma__) // ?

I'm assuming that, because they aren't macros, they should not "expand" before
stringizing.

Finally, if C++ gets C99's inline _Pragma.  Some standard pragmas could be used
to generate these tokens:

_Pragma("STDC TOKEN ,")

Which could be shortened at will to:

#define COMMA _Pragma("STDC TOKEN ,")

Thoughts?

Regards,
Paul Mensonides

_______________________________________________
Unsubscribe & other changes: http://lists.boost.org/mailman/listinfo.cgi/boost

Reply via email to