Tricky macro manipulation

A

Adrian Hawryluk

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/]______\/
 
M

mlimber

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
 
F

Fei Liu

Adrian said:
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)
 
R

red floyd

Fei said:
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)
 
A

Adrian Hawryluk

Fei said:
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/]______\/
 
C

Chris Thomasson

Adrian Hawryluk said:
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 <ENTER> to 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?
 
A

Adrian Hawryluk

Chris said:
Adrian Hawryluk said:
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 <ENTER> to 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 <ENTER> to 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/]______\/
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Similar Threads


Members online

No members online now.

Forum statistics

Threads
473,997
Messages
2,570,240
Members
46,830
Latest member
HeleneMull

Latest Threads

Top