By using this site, you agree to our updated Privacy Policy and our Terms of Use. Manage your Cookies Settings.
424,836 Members | 2,018 Online
Bytes IT Community
+ Ask a Question
Need help? Post your question and get tips & solutions from a community of 424,836 IT Pros & Developers. It's quick & easy.

Tricky macro manipulation

P: n/a
Does anyone know of a way to manipulate a macro list to remove either
the beginning or the end element? I.e. Given:

#define ELEMENTS EL(1) EL(2) EL(3)

Is there any manipulation to get just EL(1) EL(2) out of ELEMENTS?

Thanks for your help.
Adrian
--
__________________________________________________ ___________________
\/Adrian_Hawryluk BSc. - Specialties: UML, OOPD, Real-Time Systems\/
\ _---_ Q. What are you doing here? _---_ /
\ / | A. Just surf'n the net, teaching and | \ /
\__/___\___ learning, learning and teaching. You?_____/___\__/
\/______[blog:__http://adrians-musings.blogspot.com/]______\/
Mar 23 '07 #1
Share this Question
Share on Google+
6 Replies


P: n/a
On Mar 23, 11:03 am, Adrian Hawryluk <adrian.hawryluk-at-
gmail....@nospam.comwrote:
Does anyone know of a way to manipulate a macro list to remove either
the beginning or the end element? I.e. Given:

#define ELEMENTS EL(1) EL(2) EL(3)

Is there any manipulation to get just EL(1) EL(2) out of ELEMENTS?
Not that I'm aware of, but if you are willing to use the Boost
Preprocessor library, it has tuples and lists and algos that could
accomplish something similar but different.

Cheers! --M

Mar 23 '07 #2

P: n/a
Adrian Hawryluk wrote:
Does anyone know of a way to manipulate a macro list to remove either
the beginning or the end element? I.e. Given:

#define ELEMENTS EL(1) EL(2) EL(3)

Is there any manipulation to get just EL(1) EL(2) out of ELEMENTS?

Thanks for your help.
Adrian
The real question is why you need do something like that? How about:

#define ELEMENTS EL(1) EL(2) EL(3)
#define FIRST_2_ELEMENTS EL(1) EL(2)
Mar 23 '07 #3

P: n/a
Fei Liu wrote:
Adrian Hawryluk wrote:
>Does anyone know of a way to manipulate a macro list to remove either
the beginning or the end element? I.e. Given:

#define ELEMENTS EL(1) EL(2) EL(3)

Is there any manipulation to get just EL(1) EL(2) out of ELEMENTS?

Thanks for your help.
Adrian
The real question is why you need do something like that? How about:

#define ELEMENTS EL(1) EL(2) EL(3)
#define FIRST_2_ELEMENTS EL(1) EL(2)
Wouldn't it be better reversed?

#define FIRST_2_ELEMENTS EL(1) EL(2)
#define ELEMENTS FIRST_2_ELEMENTS EL(3)

Mar 23 '07 #4

P: n/a
Fei Liu wrote:
Adrian Hawryluk wrote:
>Does anyone know of a way to manipulate a macro list to remove either
the beginning or the end element? I.e. Given:

#define ELEMENTS EL(1) EL(2) EL(3)

Is there any manipulation to get just EL(1) EL(2) out of ELEMENTS?

Thanks for your help.
Adrian
The real question is why you need do something like that? How about:

#define ELEMENTS EL(1) EL(2) EL(3)
#define FIRST_2_ELEMENTS EL(1) EL(2)
The reason is for writing recursively defined template code. mlimber
gave me what I needed. The boost preprocessor library was something
that I was going to have to (in some capacity) implement if I didn't
know about it. Though I was /almost/ ok without it, this will simplify
things considerably.

Thanks all,
Adrian
--
__________________________________________________ ___________________
\/Adrian_Hawryluk BSc. - Specialties: UML, OOPD, Real-Time Systems\/
\ _---_ Q. What are you doing here? _---_ /
\ / | A. Just surf'n the net, teaching and | \ /
\__/___\___ learning, learning and teaching. You?_____/___\__/
\/______[blog:__http://adrians-musings.blogspot.com/]______\/
Mar 23 '07 #5

P: n/a

"Adrian Hawryluk" <ad**************************@nospam.comwrote in message
news:u%RMh.3219$6z3.553@edtnps82...
Does anyone know of a way to manipulate a macro list to remove either the
beginning or the end element? I.e. Given:

#define ELEMENTS EL(1) EL(2) EL(3)

Is there any manipulation to get just EL(1) EL(2) out of ELEMENTS?
[...]

#include <cstdio>

#define PLACE_X(x)x
#define PLACE(x)PLACE_X(x)
#define QUOTE_X(x)#x
#define QUOTE(x)QUOTE_X(x)
#define STRIPL_X(x, y)PLACE(x)
#define STRIPL(x)PLACE(STRIPL_X)x
#define STRIPR_X(x, y)PLACE(y)
#define STRIPR(x)PLACE(STRIPR_X)x

#define MYLIST() (node1, (node2, (node3, null)))

#define MYLIST_X(l)\
STRIPL(l)STRIPL(STRIPR(l))
/*** Static API Declaration
_________________________________***/
static char prompt_getchar(char const*);
#define promptexit_getchar(vzmp_buf)\
((int)prompt_getchar((vzmp_buf)))

/*** Static API Definition
_________________________________***/

/* Entry
-------------------*/
int main(void) {
{
printf("%s\n", QUOTE(MYLIST()));

printf("%s\n", QUOTE(MYLIST_X(MYLIST())));

} return promptexit_getchar("\n\n--- press <ENTERto exit ---\n");
}

/* Displays a prompt and waits on getchar
-------------------*/
char prompt_getchar(char const *buf) {
printf("%s", buf);
return getchar();
}

Does that work for you?
Mar 24 '07 #6

P: n/a
Chris Thomasson wrote:
"Adrian Hawryluk" <ad**************************@nospam.comwrote in message
news:u%RMh.3219$6z3.553@edtnps82...
>Does anyone know of a way to manipulate a macro list to remove either the
beginning or the end element? I.e. Given:

#define ELEMENTS EL(1) EL(2) EL(3)

Is there any manipulation to get just EL(1) EL(2) out of ELEMENTS?
[...]

#include <cstdio>

#define PLACE_X(x)x
#define PLACE(x)PLACE_X(x)
#define QUOTE_X(x)#x
#define QUOTE(x)QUOTE_X(x)
#define STRIPL_X(x, y)PLACE(x)
#define STRIPL(x)PLACE(STRIPL_X)x
#define STRIPR_X(x, y)PLACE(y)
#define STRIPR(x)PLACE(STRIPR_X)x

#define MYLIST() (node1, (node2, (node3, null)))

#define MYLIST_X(l)\
STRIPL(l)STRIPL(STRIPR(l))
/*** Static API Declaration
_________________________________***/
static char prompt_getchar(char const*);
#define promptexit_getchar(vzmp_buf)\
((int)prompt_getchar((vzmp_buf)))

/*** Static API Definition
_________________________________***/

/* Entry
-------------------*/
int main(void) {
{
printf("%s\n", QUOTE(MYLIST()));

printf("%s\n", QUOTE(MYLIST_X(MYLIST())));

} return promptexit_getchar("\n\n--- press <ENTERto exit ---\n");
}

/* Displays a prompt and waits on getchar
-------------------*/
char prompt_getchar(char const *buf) {
printf("%s", buf);
return getchar();
}

Does that work for you?

Interesting, but that gives:
////////////////////////////////////////////////////////////////////////
static char prompt_getchar(char const*);
//[...]
int main(void) {
{
printf("%s\n", "(node1, (node2, (node3, null)))");

printf("%s\n", "node1node2");

} return ((int)prompt_getchar(("\n\n--- press <ENTERto exit ---\n")));
}

char prompt_getchar(char const *buf) {
printf("%s", buf);
return getchar();
}
////////////////////////////////////////////////////////////////////////
Which shows that it is not recursively callable.

I think that I will use Boost's Meta Programming Language (MPL). The
way I was coding, I was heading in that direction (using a self included
file with macros to generate essentially the same code on separate
levels) anyway. Though Boost's MPL has now put my programming skills on
a whole new level. For me to generate that library to its current
degree would have taken me years if not decades (probably took them that
long too ;)).

Thanks anyway though.

Adrian
--
__________________________________________________ ___________________
\/Adrian_Hawryluk BSc. - Specialties: UML, OOPD, Real-Time Systems\/
\ _---_ Q. What are you doing here? _---_ /
\ / | A. Just surf'n the net, teaching and | \ /
\__/___\___ learning, learning and teaching. You?_____/___\__/
\/______[blog:__http://adrians-musings.blogspot.com/]______\/
Mar 24 '07 #7

This discussion thread is closed

Replies have been disabled for this discussion.