![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| newbee |
|
||||
![]() Бревно ![]() ![]() Профиль Группа: Участник Сообщений: 703 Регистрация: 24.8.2011 Репутация: 4 Всего: 19 |
Здравствуйте, мои дорогие плюсисты
Как известно, операторы AND и OR возвращают boolean. Но это совершенно не вяжется с моим чувством прекрасного! Правильный AND (или цепочка из них) должен последовательно выполнять выражения и в случае истинности их всех возвращать результат последнего вычисления. Аналогично с OR: последовательно вычисляются выражения и возвращается результат первого истинного. Естественно OR и AND должны быть ленивыми. Надеюсь, всем здесь присутствующим очевидно, что AND и OR, если отбросить синтаксическую шелуху, являются разновидностью условного оператора, к примеру
В С++ условный оператор if-then-else не возвращает значения, зато есть ?: который подходит с существенным ограничением: типы всех выражений должны совпадать или быть приводимыми. Вторая проблема, с которой я столкнулась, - это рекурсивные макросы, которых в С++ нет, но с помощью внешнего генератора можно эмулировать. И вот я сейчас сижу и думаю как написать правильный AND-OR. Идеально синтаксически и семантически это должно выглядеть примерно так:
Интересно, возможно ли реализовать такое и насколько близко к тому, что я хочу... Макросы, шаблоны, неоптимало и тормозно - все пофигу, лишь бы заработало. Есть ли у кого какие соображения? -------------------- You're face to face With man who sold the world |
||||
|
|||||
| boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
newbee, жуткий пример %)
ты таки на лиспе пишешь? покажи псевдокодом что хочешь получить в итоге? зы boost можно использовать? Добавлено через 5 минут это понятно. не понял что должно (хочешь) получить в итоге. Добавлено через 7 минут и 29 секунд
это расшифруй. Добавлено через 11 минут и 2 секунды т.е. результатом того что выше, может быть либо "hello(pass)", либо "false (fail)" ? но опять же, не понятно назначение и способ вычисления переменных в $AND(...) Добавлено через 14 минут и 21 секунду кажись понял.. но возвращаться же будет bool, а в твоем примере "hello" %) |
|||
|
||||
| newbee |
|
||||
![]() Бревно ![]() ![]() Профиль Группа: Участник Сообщений: 703 Регистрация: 24.8.2011 Репутация: 4 Всего: 19 |
Давай другой... Пусть у нас будут объекты типа object_t, они составляют иерархическую структуру (есть родители и дети) и все они где-нибудь зарегистрированы...
Можно. А если это потом можно будет повторить без него (сделать примитивные аналоги), вообще счастье будет Я на концерт убегаю, вечером вернусь! )) -------------------- You're face to face With man who sold the world |
||||
|
|||||
| boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
||||
|
||||
| newbee |
|
||||
![]() Бревно ![]() ![]() Профиль Группа: Участник Сообщений: 703 Регистрация: 24.8.2011 Репутация: 4 Всего: 19 |
ЗЫЫЫ Сорри за плохой пример в ОП, постаралась нормальный придумать )) -------------------- You're face to face With man who sold the world |
||||
|
|||||
| boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
ага. понял.
над решением нужно подумать... |
|||
|
||||
| newbee |
|
|||
![]() Бревно ![]() ![]() Профиль Группа: Участник Сообщений: 703 Регистрация: 24.8.2011 Репутация: 4 Всего: 19 |
И наверное я погорячилась, с "hello" и false, давай считать, что внутри результаты выражений однотипны. Как в последнем примере.
-------------------- You're face to face With man who sold the world |
|||
|
||||
| tzirechnoy |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1173 Регистрация: 30.1.2009 Репутация: 2 Всего: 16 |
Шли бы Вы хаскель изучать, а? Тем более, что через монады это действительно делается, в том числе и в плюсах.
|
|||
|
||||
| boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
ок. сегодня постараюсь закончить.. реализация на boost.preprocessor. |
|||
|
||||
| borisbn |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 22 Всего: 135 |
А что должен возвращать AND, если одно из выражений ложно ?
В случае с bool или с указателем - понятно (false и NULL соответственно), а что в случае с int или с пользовательским типом ?
М.б. то выражение, на котором "споткнулся" ??? В данном случае o2 ? А как быть, если все выражения в OR - ложны ?
В общем, надо бы ТЗ поточнее выдать ))) -------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
||||
|
|||||
| boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
я так понял - исключение выбрасывать. |
|||
|
||||
| 502 |
|
|||
![]() Я всегда прав ![]() Профиль Группа: Участник Сообщений: 134 Регистрация: 16.7.2011 Репутация: нет Всего: 4 |
это все есть в javascript
Это сообщение отредактировал(а) 502 - 3.2.2012, 18:37 |
|||
|
||||
| borisbn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 22 Всего: 135 |
дык
это ж не простой AND и OR... переменные в javascript не типизированны, а в Си++ ты не можешь в зависимости от условия присвоить переменной либо false либо std::string, например. -------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
|||
|
||||
| math64 |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2505 Регистрация: 12.4.2007 Репутация: 8 Всего: 72 |
Примерно так:
|
|||
|
||||
| 502 |
|
|||
![]() Я всегда прав ![]() Профиль Группа: Участник Сообщений: 134 Регистрация: 16.7.2011 Репутация: нет Всего: 4 |
||||
|
||||
| borisbn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 22 Всего: 135 |
если на этапе компиляции тип возвращаемого значения у выражения понятен компилятору, то он вместо auto подставляет этот тип. если же компилятор не может определить тип (а в твоём случае он определяется на этапе выполнения), то компилятор выдаст ошибку на auto.
-------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
|||
|
||||
| boostcoder |
|
||||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
а если ни одно не истинно, что возвращать?
тут должен возвращаться результат второго, если первое не истинно? а если ни одно не истинно, бросать исключение? в первом случае так же? Это сообщение отредактировал(а) boostcoder - 3.2.2012, 19:38 |
||||
|
|||||
| boostcoder |
|
||||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
вот что получилось:
http://liveworkspace.org/code/f72ac6a3004d...60bd21374ab273d результат препроцессирования:
т.к. не известно как поступать если ни одно из условий не верно, в макросы Ext_OR и Ext_AND добавил второй аргумент принимающий выражение. Это сообщение отредактировал(а) boostcoder - 3.2.2012, 21:51 |
||||
|
|||||
| newbee |
|
||||||
![]() Бревно ![]() ![]() Профиль Группа: Участник Сообщений: 703 Регистрация: 24.8.2011 Репутация: 4 Всего: 19 |
Конструктор по умолчанию.
Ну это же прекрасно!
Сейчас не в состоянии распарсить, утром попробую ) Конструктор по умолчанию. Спасибо, сейчас попытаюсь сконцентрироваться. Вариант с def тоже уместен. -------------------- You're face to face With man who sold the world |
||||||
|
|||||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
newbee,
вот еще направление, если я прально понял задачу : http://liveworkspace.org/code/962529beac6c...37a1ada28038e6e |
|||
|
||||
| newbee |
|
|||
![]() Бревно ![]() ![]() Профиль Группа: Участник Сообщений: 703 Регистрация: 24.8.2011 Репутация: 4 Всего: 19 |
Ууууух это вообще взрыв мозга))) Как это работает вообще не понятно)
AND как-то неправильно раскрывается... Добавлено через 9 минут и 53 секунды mes, спасибо большое, эта идея у меня была, но не придумала как побороть явное создание вспомогательных объектов... Все же подобная запись AND-OR интересна в первую очередь потому, что часто позволяет сильно сократить размер кода. Я обычно пользуюсь ленивостью || и && для записи условных выражений, но часто требуется получить значение выражения one || two || three, приходится писать лишний код... -------------------- You're face to face With man who sold the world |
|||
|
||||
| boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
что тут не так? Добавлено через 2 минуты и 8 секунд по отдельности Ext_OR и Ext_AND работают как надо? |
|||
|
||||
| newbee |
|
|||
![]() Бревно ![]() ![]() Профиль Группа: Участник Сообщений: 703 Регистрация: 24.8.2011 Репутация: 4 Всего: 19 |
Я думаю, где-то скобок не хватает
Смотри, у тебя AND работает по-разному для AND(1,0) и AND(0,1), хотя в обоих случаях должен быть false (или значение по умолчанию, как сейчас сделано у тебя). Добавлено через 3 минуты и 59 секунд http://liveworkspace.org/code/972cca9cb2ab...74fa566a52388b9 -------------------- You're face to face With man who sold the world |
|||
|
||||
| boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
||||
|
||||
| newbee |
|
|||
![]() Бревно ![]() ![]() Профиль Группа: Участник Сообщений: 703 Регистрация: 24.8.2011 Репутация: 4 Всего: 19 |
ЗЫ. Прикольный ты себе домен выбрал, уже скольок раз вижу, а кажется lispworks.com ))
ЗЫЫ Модераторы, пожалуйста исправьте заголовок: "помогитЕ", я когда вижу эту ошибку, хочу убить автора. -------------------- You're face to face With man who sold the world |
|||
|
||||
| boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
это ты сама можешь сделать. "редактировать" на топике. Добавлено через 2 минуты и 35 секунд
ты тут не ошиблась? а то я сделал так, что возвращает результат последнего истинного выражения) |
|||
|
||||
| newbee |
|
|||
![]() Бревно ![]() ![]() Профиль Группа: Участник Сообщений: 703 Регистрация: 24.8.2011 Репутация: 4 Всего: 19 |
Заголовок не дает исправить, только текст...
Добавлено @ 00:50
Понимаешь, это тот же оператор AND по сути, только в случае успешной проверки (AND 1 2 3), возвращаем 3 вместо true, в случае неудачной (AND 1 0 2), возвращаем 0. Это сообщение отредактировал(а) newbee - 4.2.2012, 00:51 -------------------- You're face to face With man who sold the world |
|||
|
||||
| boostcoder |
|
||||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
вот:
http://liveworkspace.org/code/f35d3794bc73...ff02fba37c68e15 препроцессированный код:
все правильно? Это сообщение отредактировал(а) boostcoder - 4.2.2012, 01:26 |
||||
|
|||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
boostcoder, если я правильно понял, то
OR возвращает первое истинное, либо последнее если такого нет.. AND возвращает первое ложное, либо последнее если такого нет.. def не нужен |
|||
|
||||
| boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
ну вроде как да... Добавлено @ 01:35 все равно не понимаю.. если не будет def, то что вернуть в случае лжи в следующем примере?
Это сообщение отредактировал(а) boostcoder - 4.2.2012, 01:38 |
|||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
newbee, логика работы операторв верна ? :
http://liveworkspace.org/code/6ca831342831...f7cb826178a2406 Добавлено через 2 минуты и 19 секунд
первый ложный |
|||
|
||||
| boostcoder |
|
||||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
судя по примеру в топике, предполагается в качестве выражений использовать и функции/методы. тогда записывать тернарное выражение нужно так?:
|
||||
|
|||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
||||
|
||||
| boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
||||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
полагаю что так :
|
|||
|
||||
| boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
но b3 вообще не проверяется. Добавлено через 1 минуту и 8 секунд хотя из примера так и выходит... |
|||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
а зачем ? если оно ложно значит вернется ложь, если верное, то вернется правда) |
|||
|
||||
| boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
а для OR в случае лжи во всех выражения, что возвращать?
моцг уже спать просится.. Добавлено через 28 секунд да-да. Добавлено через 8 минут и 33 секунды в общем, этот код правильный?
|
|||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
||||
|
||||
| boostcoder |
|
||||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
в моем тоже
http://liveworkspace.org/code/3fee4b8abd6a...1412183b759e6ec вывод:
ожидания ТС подтверждаются. Это сообщение отредактировал(а) boostcoder - 4.2.2012, 02:29 |
||||
|
|||||
| volatile |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2107 Регистрация: 7.1.2011 Репутация: 37 Всего: 85 |
Вопрос к даме. Это кальку с какого языка вы пытаетесь реализовать на С++?
что-то имхо очень скриптовое... (и конечно не типизированное) |
|||
|
||||
| borisbn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 22 Всего: 135 |
-------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
|||
|
||||
| math64 |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2505 Регистрация: 12.4.2007 Репутация: 8 Всего: 72 |
как-то не очень удобно в использовании получается
Вот мой вариант:
OR работает так, как надо. AND при истинности возвращает последний элемент, а не первый. |
|||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
при истинности последний и должен ) |
|||
|
||||
| boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
math64, еще бы от Saver`а избавиться...
|
|||
|
||||
| newbee |
|
|||
![]() Бревно ![]() ![]() Профиль Группа: Участник Сообщений: 703 Регистрация: 24.8.2011 Репутация: 4 Всего: 19 |
Мммм и еще раз здравствуйте
Друзья, из вашего сумбурного диалога я так и не поняла, поняли ли вы меня... Еще раз: функции OR и AND - не какие-то сферические штуковины со знакомыми названиями! Это аналогия обычных операторов && и ||, которые могут принимать >=0 параметров (на практике сойдет >=2). Как работает обычный ||: он последовательно вычисляет аргументы и как как только наткнется на истинный результат, возвращает true, OR же вместо true возвращает само это вычисленное значение. Если все аргументы ложны, и ||, и OR возвращают 0. Обычный &&: последовательно вычисляются аргументы, при встрече первого ложного результата возвращается 0, в AND - аналогично. Если результат вычисления всех аргументов истинен, && возвращает true, AND возвращает последний результат. mes, у тебя функции неленивые (поправь, если я не права), для AND/OR это недопустимо... В лучшем случае это обернется легко обнаруживаемым сегфолтом, в худшем - сложно уловимыми побочными эффектами. По логике правильно. volatile, Common Lisp. Не скриптовое, динамически типизированное. math64, спасибо за помощь, сейчас буду разбираться... boostcoder, тебе вообще огромное спасибо, сейчас тоже потыкаю твой последний вариант... Я вот сижу смотрю на раскрытие макроса и понимаю, что его аргументы (b1)(b2)(b3) будут вычисляться далеко не один раз... Значит нужно вначале раскрытия генерировать примерно следующее:
И потом внутри мега ?:-конструкции использовать __tmp_X вместо bX. Мне сложно судить наверняка, но при нынешнем однопроходном раскрытии макроса это нереально. И отчасти вдогонку к этому, не мог бы ты объяснить без привязки к BOOST_PP, каким образом препроцессор си раскрывает макрос macro((b1)(b2))? То есть получается, он не просто разбивает входные аргументы, а распарсивает выражение... -------------------- You're face to face With man who sold the world |
|||
|
||||
| boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
и выражения перестанут быть ленивыми. ты это.. протесть то что у меня получилось, чтоб я убедился в том что правильно тебя понял и сделал. потом подумаем над доделками. в терминах boost.preprocessor - это последовательность. я же, итерируюсь по последовательности, и на каждой итерации раскрываю часть общего выражения. Добавлено через 10 минут и 1 секунду можно дважды пройтись по последовательности. |
|||
|
||||
| volatile |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2107 Регистрация: 7.1.2011 Репутация: 37 Всего: 85 |
Ну да. динамически типизированное. там это имеет практический смысл. В С++ даже если и получиться написать (кстати неплохие варианты тут предлагали, ребята постарались!) но использовать это почти не получится. Все аргументы должны быть приводимы к одному типу, и кроме того еще и к bool (если я правильно понял..) Где это можно использовать? Не, ну можно конечно что-то придумать такое, где такое применить, но это имхо, искусственное притягивание за уши. На приктике (при статической типизации) это практически бемполезная конструкция, имхо конечно. Это сообщение отредактировал(а) volatile - 5.2.2012, 23:58 |
|||
|
||||
| newbee |
|
||||||
![]() Бревно ![]() ![]() Профиль Группа: Участник Сообщений: 703 Регистрация: 24.8.2011 Репутация: 4 Всего: 19 |
boostcoder, я поэксперементировала с твоими вариантами, с точки зрения логики раскрытия все правильно! Ты прав, сразу раскрывать все аргументы нельзя - привет, ленивость! Но нашлась мысля
-------------------- You're face to face With man who sold the world |
||||||
|
|||||||
| boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
не знал. попробую.
именно так. к примеру простой макрос BOOST_PP_SEQ_SIZE(): https://github.com/ryppl/boost-svn/blob/mas...or/seq/size.hpp макрос: var = BOOST_PP_SEQ_SIZE((a)(b)©) развернется в: var = BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_3 который в свою очередь описан как: # define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_3 3 т.е. весь boost.preprocessor работает по нескольким основным принципам. либо по кол-ву аргументов, либо специализациями для всех возможных количеств аргументов. все на самом деле очень просто. Добавлено через 3 минуты и 58 секунд или я не понял вопроса... Добавлено через 8 минут и 57 секунд хм.. http://liveworkspace.org/code/35bcbcc90f05...d71d9b551f41499 дай ссылку на описание расширения. |
|||
|
||||
| newbee |
|
|||
![]() Бревно ![]() ![]() Профиль Группа: Участник Сообщений: 703 Регистрация: 24.8.2011 Репутация: 4 Всего: 19 |
У тебя включен pedantic.
http://gcc.gnu.org/onlinedocs/gcc/Statement-Exprs.html Компилируй с -std=gnu++98 или -std=gnu++0x -------------------- You're face to face With man who sold the world |
|||
|
||||
| boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
угу. в общем работает. попробую доделать.. Добавлено через 2 минуты и 31 секунду mes, а Вы свой вариант будите доделывать? просто любопытно посмотреть на решение. я тут еще подумал... для функционального программирования в с++, разработали boost.phoenix. еще попробую с его помощью решить задачу. |
|||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
boostcoder, мой вариант придет к буст лямбде
еще не приходилось сталкиваться Это сообщение отредактировал(а) mes - 6.2.2012, 10:13 |
|||
|
||||
| boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
||||
|
||||
| boostcoder |
|
||||||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
newbee, итак.
давай посмотрим на препроцессированный вариант твоих тестов:
результат:
теперь нужно выявить вложенность "скопов" для того чтоб определить в каком скопе какое выражение должно вычисляться... Добавлено @ 01:32 лишние скобки уберем.. Добавлено @ 01:36 вот что получилось:
Это сообщение отредактировал(а) boostcoder - 9.2.2012, 01:37 |
||||||
|
|||||||
| newbee |
|
||||||
![]() Бревно ![]() ![]() Профиль Группа: Участник Сообщений: 703 Регистрация: 24.8.2011 Репутация: 4 Всего: 19 |
boostcoder, у тебя сложно раскрывается AND. Я для наглядности буду возвращать нули вместо самих вычисленных значений.
Теперь... Смотри, внутри OR и AND излишне следовать правилу раскрытия элемента последовательности x?x: Если x - вложенный AND или OR, его можно прямо встроить в выражение. Я не знаю, можно ли это сделать на дефайнах... Это необязательно. Таким образом твой пример принял бы форму
Теперь давай подумаем со скопами...
И аналогично должно быть с OR. Потом напишу, если надо. Я нигде не накосячила? -------------------- You're face to face With man who sold the world |
||||||
|
|||||||
| boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
||||
|
||||
| math64 |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2505 Регистрация: 12.4.2007 Репутация: 8 Всего: 72 |
(не проверял) |
|||
|
||||
| boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
newbee, смотри какое дело.
код:
как ты можешь видеть, тут вложенные скопы. но препроцессор не может рекурсию. он однопроходный. идеи? |
|||
|
||||
| boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
попробовал двумя проходами по последовательности генерировать сначала открывающиеся скопы, потом по той же последовательности, закрывающиеся.
на примере Ext_OR((b1)(b2)(b3)):
вроде то, что надо. но при попытке использовать вложенные макросы "Ext_OR ((b1)(b2)(b3)(Ext_OR ((b1)(b2)(b3))))" получаю ошибку препроцессора. и правильно. при первом проходе еще ничего не сгенеренно. по этому препроцессор генерит нормально, не смотря на непарные скобки. но при втором проходе, он, "видя" такое ( идеи будут? Добавлено через 2 минуты и 6 секунд math64, не правильно. в твоем коде все равно выражения будут вычисляться не единожды. |
|||
|
||||
| newbee |
|
||||
![]() Бревно ![]() ![]() Профиль Группа: Участник Сообщений: 703 Регистрация: 24.8.2011 Репутация: 4 Всего: 19 |
Бустик, я совсем запуталась в твоих буст-пппроблемах :(
Сделала OR сама, ленивый, молодежный, современный!
Критика, вопросы, предложения приветствуются! PS. В архиве несколько вспомогательных файлов. Присоединённый файл ( Кол-во скачиваний: 7 )
OR_AND.tar 20,00 Kb-------------------- You're face to face With man who sold the world |
||||
|
|||||
| k0rvin |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 442 Регистрация: 24.1.2010 Репутация: 1 Всего: 5 |
Жду решения на Хаскелле. -------------------- “Object-oriented design is the roman numerals of computing.” — Rob Pike All software sucks |
|||
|
||||
| boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
слуш.
а что если макрос будет раскрываться так?
т.е. все выражения будут вычисляться сразу. а? или не актуально? Добавлено через 2 минуты и 33 секунды а в архиве какие конкретно вирусы? Добавлено через 5 минут и 48 секунд вообще у тебя не плохо получилось. и без зависимости от буста |
|||
|
||||
| newbee |
|
|||
![]() Бревно ![]() ![]() Профиль Группа: Участник Сообщений: 703 Регистрация: 24.8.2011 Репутация: 4 Всего: 19 |
Но сначала вычислять никак нельзя. Посмотри любой свой код, с нелинивыми операторами if, || и && он скорее всего рассыпется. Добавлено через 2 минуты и 48 секунд Он несжатый) Потому что нагенерировала специфичных под задачу макросов? Хотела сделать более обобщенный FOREACH, но там были бы сложности и неудобства. Или что еще плохо? -------------------- You're face to face With man who sold the world |
|||
|
||||
| boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
||||
|
||||
| newbee |
|
|||
![]() Бревно ![]() ![]() Профиль Группа: Участник Сообщений: 703 Регистрация: 24.8.2011 Репутация: 4 Всего: 19 |
Блин, косая я. Не плохо получилось)) Неплохо, да! ))
-------------------- You're face to face With man who sold the world |
|||
|
||||
| boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
это не стёб был. в самом деле нормально получилось. просто и понятно. Добавлено через 26 секунд Добавлено через 14 минут и 49 секунд ну..мне простительно. русский мне не родной язык |
|||
|
||||
| math64 |
|
||||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2505 Регистрация: 12.4.2007 Репутация: 8 Всего: 72 |
Вычислятся быдут один раз. Проверяться и копироваться - да, много раз (при сложной формуле).
Идеи? Не пытаться делать макрос в переменным числом агрументов, генерирующих всё выражение, а набор макросов генерирующих фрагменты выражения. Временной для запоминания переменной можно обойтись одной, поэтому можно опробовать что-то типа
Возможно использовать набор макросов AND2(var1,var2), AND3(var1,var2,var3) и т.д. Добавлено через 5 минут и 50 секунд Неправильно. Выражения должны вычисляться только после проверки предыдущих:
|
||||
|
|||||
| newbee |
|
|||
![]() Бревно ![]() ![]() Профиль Группа: Участник Сообщений: 703 Регистрация: 24.8.2011 Репутация: 4 Всего: 19 |
math64, я не понимаю, что у тебя за бегины и енды... Ты что-то недокопипастил?..
Добавлено через 10 минут и 41 секунду Кстати... Есть ли у кого-нибудь идеи, как избавиться от typeof и ({}) расширений? На шаблонах или хз как еще... Возможно придется компилировать под винду, там я предпочитаю компилятор MSVC. -------------------- You're face to face With man who sold the world |
|||
|
||||
| vol4ek |
|
|||
![]() конь в пальто ![]() ![]() Профиль Группа: Участник Сообщений: 304 Регистрация: 1.5.2011 Где: Минск Репутация: 0 Всего: 0 |
||||
|
||||
| math64 |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2505 Регистрация: 12.4.2007 Репутация: 8 Всего: 72 |
Отвечал на последнее сообщение предыдущей страницы - не заметил что есть ещё сообщения. Это просто идеи, как построить макросы - не проработано до конца. Если типы всех переменных одинаковы, можно использовать только одну временную переменную, которая объявлена в макросе BEGIN(type) Макрос END закрывает объявление Макросы, используемые в середине не проработаны. Идея c AND2(), AND3(), OR2(), OR3() - уже не актуальна, Вы сделали лучше. Как избавиться от ({}) - я уже предлагал - класс Saver, его можно переделать, чтобы был синглетоном и замоминал всё что можно как Variant, но typeof() всё равно нужен, чтобы получить запомненное значение нужного типа. Но если комплятор поддерживает ({}) - лучше использовать их (в объявлении макросов - условная трансляция) |
|||
|
||||
| boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
||||
|
||||
| math64 |
|
||||||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2505 Регистрация: 12.4.2007 Репутация: 8 Всего: 72 |
уже объяснял - не прочитал всё до конца если нет - x ? y : z всё равно не скомпилируется, или все должны приводиться к типу первого выражения, его и использовать, или объявить тип переменной самостоятельно.
В этом случае тип результата нужно объявлять самостоятельно
Правда, есть случай, когда даже при одном типе объединять нельзя:
Но он тоже не компилируется - результат ({ }) не int&, а int |
||||||
|
|||||||
| boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
||||
|
||||
| math64 |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2505 Регистрация: 12.4.2007 Репутация: 8 Всего: 72 |
Нужно доработать макросы AND и OR, чтобы принимали переменное число агрументов (как в PP_NARG.h или из boost) и моглм комбинироваться.
TEST используется для задания значения по умолчанию для обычных типов TESTR используется для задания значения по умолчанию для ссылок для ссылок желательно обезопасить от порчи значение по умочанию.
|
|||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |