
On 11/24/2010 5:45 PM, Jeffrey Lee Hellrung, Jr. wrote:
On 11/24/2010 2:14 PM, Edward Diener wrote: [...]
I am still not sure what you mean by "macro composition" and "argument binding" in a preprocessor library. Boost PP has much support for macro composition within the context of what it offers in the form of repeatable constructs, data types, etc. but I have a feeling you mean something else. As far as "argument binding", in terms of preprocessor macros all arguments are initially in the form of tokens, so I am not sure what you mean by the phrase.
Imagine Boost.MPL without placeholders.
As a simple example, suppose you already have a macro handy:
#define macro( n ) ...insert your favorite expression involving n...
and want to use it in an invocation of BOOST_PP_ENUM. This requires defining a forwarding macro:
#define macro2( z, n, data ) macro( n ) BOOST_PP_ENUM( N, macro2, ~ )
Argument binding refers to the ability to bind the arguments of function-style macros to tokens or placeholders for tokens to be substituted later. So one would be able to do something like (making up the syntax from what I can remember)
BOOST_PP_ENUM( N, BIND( macro, 2 ), ~ )
where BIND( macro, 2 )( z, n, data ) expands (intermediately) to macro( n ). The tokens 1, 2, 3, ... are placeholders to be substituted later, and to bind literal tokens to macro arguments, you wrap them in parentheses, so that BIND( macro, ( foo ) )( z, n, data ) expands to macro( foo ).
Using the fictitious BIND macro, you can also compose macros inline, similar to how Boost.Bind works.
This, at least, is what I remember from browsing through either the Avalanche code or Paul's Chaos/Order code, I don't remember which. But I think both basically provide this functionality.
Hopefully that poor and hastily typed explanation helps,
I understand the explanation. It does not have anything to do with variadic data as I see it so I do not see it being part of what I have done. Perhaps someone else can come up with an implementation of your bind idea for macros.