Макросы
От: stalcer Россия  
Дата: 08.10.04 06:42
Оценка:
Возможно ли написать макросы, используемые вот так:

    M_BEGIN
        M_ACTION(1, 2)
        M_ACTION(3, 4)
    M_END


Ну, или как-нибудь так:

    M_X(
        M_ACTION(1, 2)
        M_ACTION(3, 4)
    )


Чтобы они раскрывались так:

    int x = 0
        + 1 
        + 3
    ;
    
    int y = 0
        + 2
        + 4
    ;
... << RSDN@Home 1.1.3 beta 1 >>
Re: Макросы
От: butcher Россия http://bu7cher.blogspot.com
Дата: 08.10.04 06:48
Оценка:
Здравствуйте, stalcer, Вы писали:

S>Возможно ли написать макросы, используемые вот так:

Используй символ '\' в конце строки для переноса. Можно делать многострочные макросы..

Нет ничего невозможного..
Re: Макросы
От: dupamid Россия  
Дата: 08.10.04 06:53
Оценка:
Здравствуйте, stalcer, Вы писали:

S>Возможно ли написать макросы, используемые вот так:


Ты вот это хотел?
#include <boost/preprocessor/selection/min.hpp>

#define M_BEGIN int x = 0
#define M_ACTION(a, b) + BOOST_PP_MIN(a, b) 
#define M_END ;


M_BEGIN
    M_ACTION(1, 2)
    M_ACTION(3, 4)
M_END

Вывод препроцессора:
int x = 0
    + 1
    + 3
;
Re[2]: Макросы
От: stalcer Россия  
Дата: 08.10.04 06:55
Оценка: +1
Здравствуйте, butcher, Вы писали:

B>Используй символ '\' в конце строки для переноса. Можно делать многострочные макросы..


Вы не поняли сути вопроса.
... << RSDN@Home 1.1.3 beta 1 >>
Re[2]: Макросы
От: stalcer Россия  
Дата: 08.10.04 07:00
Оценка:
Здравствуйте, dupamid, Вы писали:

Нет. Мне нужен точно такой результат, какой я написал, т.е. чтобы сформировался и 'x' и 'y'. Причем 'x' — из певых аргументов макросов, а 'y' — из вторых.
... << RSDN@Home 1.1.3 beta 1 >>
Re: Макросы
От: korzhik Россия  
Дата: 08.10.04 07:02
Оценка:
Здравствуйте, stalcer, Вы писали:

то так как ты написал нельзя, если вот так:
M_BEGIN(x)
    M_ACTION(1, 3)
M_END
// expand to
// int x = 0
//       + 1
//       + 2
//       + 3
//          ;

то можно
Re[3]: Макросы
От: dupamid Россия  
Дата: 08.10.04 07:04
Оценка:
Здравствуйте, stalcer, Вы писали:

S>Нет. Мне нужен точно такой результат, какой я написал, т.е. чтобы сформировался и 'x' и 'y'. Причем 'x' — из певых аргументов макросов, а 'y' — из вторых.


Т.е. оба одновременно и один из них содержал сумму min, а второй сумму max? Тогда это нужно было пояснить в вопросе.
Re[4]: Макросы
От: korzhik Россия  
Дата: 08.10.04 07:08
Оценка:
Здравствуйте, dupamid, Вы писали:

D>Здравствуйте, stalcer, Вы писали:


S>>Нет. Мне нужен точно такой результат, какой я написал, т.е. чтобы сформировался и 'x' и 'y'. Причем 'x' — из певых аргументов макросов, а 'y' — из вторых.


D>Т.е. оба одновременно и один из них содержал сумму min, а второй сумму max?


да не , не надо никаких сумм ему.
ему надо чтобы было так:
M_BEGIN
        M_ACTION(1, 2)
        M_ACTION(3, 4)
//               |  |
//               x  y 
M_END
// expand to:
// 
//    int x = 0
//        + 1 
//        + 3
//    ;
//    
//    int y = 0
//        + 2
//        + 4
//    ;


> Тогда это нужно было пояснить в вопросе.

да уж вопрос не чётко поставлен
Re[2]: Макросы
От: korzhik Россия  
Дата: 08.10.04 07:09
Оценка:
Здравствуйте, korzhik, Вы писали:

K>Здравствуйте, stalcer, Вы писали:


K>то так как ты написал нельзя


а может и получится с помощью BOOST_PP_ASSIGN_SLOT
Re[5]: Макросы
От: stalcer Россия  
Дата: 08.10.04 07:16
Оценка:
Здравствуйте, korzhik, Вы писали:

K>да не , не надо никаких сумм ему.

K>ему надо чтобы было так: <skiped>

Да, так и мужно.

K>да уж вопрос не чётко поставлен


Каюсь.
... << RSDN@Home 1.1.3 beta 1 >>
Re[3]: Макросы
От: dupamid Россия  
Дата: 08.10.04 08:00
Оценка:
Здравствуйте, stalcer, Вы писали:

S>Здравствуйте, dupamid, Вы писали:


S>Нет. Мне нужен точно такой результат, какой я написал, т.е. чтобы сформировался и 'x' и 'y'. Причем 'x' — из певых аргументов макросов, а 'y' — из вторых.


А вот так?
#include <boost/preprocessor/repetition.hpp>
#include <boost/preprocessor/punctuation/comma_if.hpp>
#include <boost/preprocessor/seq/elem.hpp>
#include <boost/preprocessor/seq/for_each.hpp>

#define M_ACTION(x, y) (+) (x) (y)

#define A(z, c, b) BOOST_PP_IF(c, BOOST_PP_SEQ_ELEM(0, b) BOOST_PP_SEQ_ELEM(2, b), BOOST_PP_SEQ_ELEM(0, b) BOOST_PP_SEQ_ELEM(1, b))

#define M_X(a, b) int x = 0 BOOST_PP_SEQ_FOR_EACH(A, 0, (a) (b));\
                  int y = 0 BOOST_PP_SEQ_FOR_EACH(A, 1, (a) (b));

M_X(
    M_ACTION(1, 2),
    M_ACTION(3, 4)
)


Раскрывается так:
int x = 0 + 1 + 3 ; int y = 0 + 2 + 4 ;

Или число секций M_ACTION должно быть не ограничено?
Re[4]: Макросы
От: dupamid Россия  
Дата: 08.10.04 08:06
Оценка: 6 (1)
#include <boost/preprocessor/repetition.hpp>
#include <boost/preprocessor/punctuation/comma_if.hpp>
#include <boost/preprocessor/seq/elem.hpp>
#include <boost/preprocessor/seq/for_each.hpp>

#define M_ACTION(x, y) ((+) (x) (y))

#define A(z, c, b) BOOST_PP_IF(c, BOOST_PP_SEQ_ELEM(0, b) BOOST_PP_SEQ_ELEM(2, b), BOOST_PP_SEQ_ELEM(0, b) BOOST_PP_SEQ_ELEM(1, b))

#define M_X(a) int x = 0 BOOST_PP_SEQ_FOR_EACH(A, 0, a);\
                  int y = 0 BOOST_PP_SEQ_FOR_EACH(A, 1, a);

M_X(
    M_ACTION(1, 2)
    M_ACTION(3, 4)
    M_ACTION(5, 6)
    M_ACTION(7, 8)
)

Порлучается:
int x = 0 + 1 + 3 + 5 + 7 ; int y = 0 + 2 + 4 + 6 + 8 ;
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.