Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Помогите написать пару макросов 
:(
    Опции темы
newbee
Дата 10.2.2012, 12:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бревно
**


Профиль
Группа: Участник
Сообщений: 703
Регистрация: 24.8.2011

Репутация: 4
Всего: 19



Бустик, я совсем запуталась в твоих буст-пппроблемах :(

Сделала OR сама, ленивый, молодежный, современный! smile

Код

#include"PP_NARG.h"
#include"PP.h"
#include"PP_OR.h"

#define OR(...) PP_CONCATENATE(PP_OR_,PP_NARG(__VA_ARGS__))(__VA_ARGS__)

#include<iostream>

int foo(){
 std::cout<<__PRETTY_FUNCTION__<<std::endl;
 return 0;}

int bar(){
 std::cout<<__PRETTY_FUNCTION__<<std::endl;
 return 3;}

int main(){
 std::cout<<"out: "<<OR(foo(),OR(foo(),0),bar(),bar(),42)<<std::endl;
 std::cout<<"out: "<<OR(foo(),OR(bar(),foo()),bar(),bar(),42)<<std::endl;
 std::cout<<"out: "<<OR(42,OR(foo(),0),bar(),bar(),42)<<std::endl;
 return 0;}


Цитата
int foo()
int foo()
int bar()
out: 3
int foo()
int bar()
out: 3
out: 42


Критика, вопросы, предложения приветствуются!

PS. В архиве несколько вспомогательных файлов.

Присоединённый файл ( Кол-во скачиваний: 7 )
Присоединённый файл  OR_AND.tar 20,00 Kb


--------------------
You're face to face
With man who sold the world
PM   Вверх
k0rvin
Дата 10.2.2012, 13:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 442
Регистрация: 24.1.2010

Репутация: 1
Всего: 5



Цитата(tzirechnoy @ 3.2.2012,  17:25)
Шли бы Вы хаскель изучать, а? Тем более, что через монады это действительно делается, в том числе и в плюсах.

Жду решения на Хаскелле.


--------------------
“Object-oriented design is the roman numerals of computing.” — Rob Pike
All software sucks
PM MAIL   Вверх
boostcoder
Дата 10.2.2012, 13:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



слуш.
а что если макрос будет раскрываться так?
Код

Ext_OR((b1)(b2)(b3));

...

({
typeof(b1) _0 = (b1);
typeof(b2) _1 = (b2);
typeof(b3) _2 = (b3);

(... ternarka ...);
})

т.е. все выражения будут вычисляться сразу. а?
или не актуально?

Добавлено через 2 минуты и 33 секунды
Цитата(newbee @  10.2.2012,  12:57 Найти цитируемый пост)
OR_AND.tar 20,00 Kb

а в архиве какие конкретно вирусы? smile

Добавлено через 5 минут и 48 секунд
вообще у тебя не плохо получилось. и без зависимости от буста smile
PM WWW   Вверх
newbee
Дата 10.2.2012, 13:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бревно
**


Профиль
Группа: Участник
Сообщений: 703
Регистрация: 24.8.2011

Репутация: 4
Всего: 19



Цитата(boostcoder @  10.2.2012,  14:35 Найти цитируемый пост)

т.е. все выражения будут вычисляться сразу. а?
или не актуально?
Да нет, актуально. Интересно, как это будет выглядеть на бусте. Я когда тему создавала сразу предполагала, что ты родишь что-нибудь буст-препроцессорное...

Но сначала вычислять никак нельзя. Посмотри любой свой код, с нелинивыми операторами if, || и && он скорее всего рассыпется.

Добавлено через 2 минуты и 48 секунд
Цитата(boostcoder @  10.2.2012,  14:35 Найти цитируемый пост)
а в архиве какие конкретно вирусы?
Он несжатый)

Цитата(boostcoder @  10.2.2012,  14:35 Найти цитируемый пост)
вообще у тебя не плохо получилось.
Потому что нагенерировала специфичных под задачу макросов? Хотела сделать более обобщенный FOREACH, но там были бы сложности и неудобства. Или что еще плохо?



--------------------
You're face to face
With man who sold the world
PM   Вверх
boostcoder
Дата 10.2.2012, 13:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



Цитата(newbee @  10.2.2012,  13:43 Найти цитируемый пост)
Но сначала вычислять никак нельзя. Посмотри любой свой код, с нелинивыми операторами if, || и && он скорее всего рассыпется.

ну да..

Добавлено через 11 секунд
ладно, думаю...
PM WWW   Вверх
newbee
Дата 10.2.2012, 13:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бревно
**


Профиль
Группа: Участник
Сообщений: 703
Регистрация: 24.8.2011

Репутация: 4
Всего: 19



Блин, косая я. Не плохо получилось)) Неплохо, да! ))


--------------------
You're face to face
With man who sold the world
PM   Вверх
boostcoder
Дата 10.2.2012, 13:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



Цитата(newbee @  10.2.2012,  13:43 Найти цитируемый пост)
Потому что нагенерировала специфичных под задачу макросов?

это не стёб был.
в самом деле нормально получилось. просто и понятно.

Добавлено через 26 секунд
Цитата(newbee @  10.2.2012,  13:46 Найти цитируемый пост)
косая я

 smile

Добавлено через 14 минут и 49 секунд
Цитата(newbee @  10.2.2012,  13:46 Найти цитируемый пост)
Неплохо

ну..мне простительно. русский мне не родной язык smile 
PM WWW   Вверх
math64
Дата 10.2.2012, 18:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 8
Всего: 72



Вычислятся быдут один раз. Проверяться и копироваться - да, много раз (при сложной формуле).
Идеи? Не пытаться делать макрос в переменным числом агрументов, генерирующих всё выражение, а набор макросов генерирующих фрагменты выражения.
Временной для запоминания переменной можно обойтись одной, поэтому можно опробовать что-то типа
Код

#define BEGIN(type) ({type _tmp;
#define BEGIN2(var) ({typeof(var) _tmp = var;
#define END ;})
#define AND == 0 ? 0 :
#define SAVE(var) (tmp = var)
#define OR   != 0  ? _tmp :

Возможно использовать набор макросов AND2(var1,var2), AND3(var1,var2,var3) и т.д.

Добавлено через 5 минут и 50 секунд
Цитата(boostcoder @  10.2.2012,  13:35 Найти цитируемый пост)
т.е. все выражения будут вычисляться сразу. а?

Неправильно. Выражения должны вычисляться только после проверки предыдущих:
Код

list<int> a;
count << AND(a.size(), a[0]) << endl; // нельзя вычислять a[0] до проверки размера списка


PM   Вверх
newbee
Дата 10.2.2012, 19:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бревно
**


Профиль
Группа: Участник
Сообщений: 703
Регистрация: 24.8.2011

Репутация: 4
Всего: 19



math64, я не понимаю, что у тебя за бегины и енды... Ты что-то недокопипастил?..

Добавлено через 10 минут и 41 секунду
Кстати... Есть ли у кого-нибудь идеи, как избавиться от typeof и ({}) расширений? На шаблонах или хз как еще... Возможно придется компилировать под винду, там я предпочитаю компилятор MSVC.


--------------------
You're face to face
With man who sold the world
PM   Вверх
vol4ek
Дата 10.2.2012, 19:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


конь в пальто
**


Профиль
Группа: Участник
Сообщений: 304
Регистрация: 1.5.2011
Где: Минск

Репутация: 0
Всего: 0



Цитата(newbee @  10.2.2012,  19:13 Найти цитируемый пост)
math64, я не понимаю, что у тебя за бегины и енды... Ты что-то недокопипастил?..


на VB похоже...  smile 

PM MAIL ICQ   Вверх
math64
Дата 10.2.2012, 19:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 8
Всего: 72



Цитата(newbee @  10.2.2012,  19:13 Найти цитируемый пост)
math64, я не понимаю, что у тебя за бегины и енды... Ты что-то недокопипастил?

Отвечал на последнее сообщение предыдущей страницы - не заметил что есть ещё сообщения.
Это просто идеи, как построить макросы - не проработано до конца.
Если типы всех переменных одинаковы, можно использовать только одну временную переменную, которая объявлена в макросе BEGIN(type)
Макрос END закрывает объявление
Макросы, используемые в середине не проработаны.
Идея c AND2(), AND3(), OR2(), OR3() - уже не актуальна, Вы сделали лучше.
Как избавиться от ({}) - я уже предлагал - класс Saver, его можно переделать, чтобы был синглетоном и замоминал всё что можно как Variant, но typeof() всё равно нужен, чтобы получить запомненное значение нужного типа. Но если комплятор поддерживает ({}) - лучше использовать их (в объявлении макросов - условная трансляция)

PM   Вверх
boostcoder
Дата 10.2.2012, 20:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



Цитата(math64 @  10.2.2012,  18:37 Найти цитируемый пост)
Неправильно.

не нужно повторять.

Цитата(math64 @  10.2.2012,  18:37 Найти цитируемый пост)
Не пытаться делать макрос в переменным числом агрументов, генерирующих всё выражение, а набор макросов генерирующих фрагменты выражения.

жуть какая-то) как же такое юзать? оО

Цитата(math64 @  10.2.2012,  19:52 Найти цитируемый пост)
Если типы всех переменных одинаковы

а если нет?

PM WWW   Вверх
math64
Дата 10.2.2012, 21:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 8
Всего: 72



Цитата(boostcoder @  10.2.2012,  20:05 Найти цитируемый пост)
не нужно повторять.

уже объяснял - не прочитал всё до конца
Цитата(boostcoder @  10.2.2012,  20:05 Найти цитируемый пост)
а если нет?

если нет -   x ? y : z всё равно не скомпилируется, или все должны приводиться к типу первого выражения, его и использовать, или объявить тип переменной самостоятельно.
Код

  int* a = 0;
  long* b = 0;
  void* p = a ? a : b; // error: conditional expression distinct pointer types ...

В этом случае тип результата нужно объявлять самостоятельно
Код

void* p = ({void* tmp; (tmp = a) ? tmp : (tmp = b) ? b : 0; });


Правда, есть случай, когда даже при одном типе объединять нельзя:
Код

int& foo();
int& bar();
int zero = 0;
int& rzero = zero;
int& r = ({ int&tmp = foo();
              tmp ? tmp :
              ({ int&tmp=bar();
                 tmp?tmp:rzero;
              });
            });

Но он тоже не компилируется - результат ({ }) не int&, а int

PM   Вверх
boostcoder
Дата 10.2.2012, 21:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



Цитата(math64 @  10.2.2012,  21:14 Найти цитируемый пост)
если нет -   x ? y : z всё равно не скомпилируется

да. туплю.

PM WWW   Вверх
math64
Дата 11.2.2012, 08:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 8
Всего: 72



Нужно доработать макросы AND и OR, чтобы принимали переменное число агрументов (как в PP_NARG.h или из boost) и моглм комбинироваться.
TEST используется для задания значения по умолчанию для обычных типов 
TESTR используется для задания значения по умолчанию для ссылок
для ссылок желательно обезопасить от порчи значение по умочанию.
Код

#define TEST(def,and_or) ({ typeof(def) _tmp = def; and_or; _tmp; })
#define AND(var1,var2) if(var1) if(typeof(var2) _and2=(var2)) _tmp = _and2;
#define OR(var1,var2) if(typeof(var1) _or = (var1)) _tmp = _or; else if(typeof(var2) _or=(var2)) _tmp = _or;
#define TYPEOFR(var) typeof(&(var))
#define TESTR(def,and_or) *({ typeof(&(def)) _tmp = &(def); and_or; _tmp; })
#define ANDR(var1,var2) if(var1) { typeof(&(var2)) _and = &(var2); if(*_and) _tmp = _and; }
#define ORR(var1,var2) { typeof(&(var1)) _or = &var1; if(*_or) _tmp = _or; else { typeof(&(var2)) _or=&(var2); if(*_or) _tmp = _or; }}

#include <iostream>
using namespace std;

int& foo() {
cout << "foo()" << endl;
static int res = 0;
return res;
}

int& bar() {
cout << "bar()" << endl;
static int res = 1;
return res;
}

int main() {

cout << TEST(0,OR(foo(),bar())) << endl;
cout << TEST(0,AND(foo(),bar())) << endl;
int zero = 0;
int& rzero = zero;
cout << "rzero:" << &rzero << endl;
cout << "foo():" << &foo() << endl;
cout << "bar():" << &bar() << endl;
TESTR(rzero,ORR(foo(),bar())) = 2;
int& r1 = TESTR(rzero,ORR(foo(),bar()));
cout << "r1:" << &r1 <<'='<< r1 << endl;
int& r2 = TESTR(rzero,ANDR(foo(),bar()));
cout << "r2:" << &r2 <<'='<< r2 << endl;
}


PM   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0891 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.