Здравствуйте, niXman, Вы писали:
X>мне часто хочется функциональных if и switch.
А мне часто хочется какого-то обобщенного широкого решения для всех этих разнородных и жалких операторов родом из 70-х (или даже раньше). Придумали десяток узких конструкций, которые, якобы, покрывают все необходимости программистов, а мы вынуждены подгонять под них наши алгоритмы.
1. Теоретически, любой блок может иметь возвратное значение — хоть if, хоть for, хоть try.
2. Теоретически, любой цикл-блок может иметь finally (если он закончился штатно, пройдя все итерации) и else/default (если из него выпали бряком)
3. Теоретически, любой блок может иметь имя и список аргументов, по которому его можно позвать многократно, не создавая отдельной функции или лямбды.
4. Теоретически, любой блок может иметь continue, отправляющий программу в начало блока.
5. Теоретически, любой блок может иметь любое другое свойство любого другого блока, реализованное для другого вида блока.
Не все композиции будут одинаково полезны, но текущая ситуация реально выглядит архаично, как будто всю мощь современного С++ стоит на каком-то школьном паскалеподобном диалекте.
Re: что думаете про функциональные if-else, switch, for, while ?
Кажется, это должно работать так: если хочется что-то добавить в язык, то желательно сделать прототип, попробовать им воспользоваться, собрать шишки, и если опыт окажется удачным, то внести предложение в комитет (можно, конечно, и без прототипа, но это даст меньше шансов, если польза от предложения не очевидна сразу всем).
И вот эта идея на самом деле уже реализована много-много лет назад, как минимум в трёх известных компиляторах (gcc/clang/icc) под названием Statements and Declarations in Expressions. Тот факт, что за это время этой возможностью серьёзно никто не заинтересовался, говорит лишь о том, что, видимо, такая функциональность никому особо и не нужна в стандарте языка. Тем более, что появившиеся с тех времён лямбды теперь предлагают достаточно универсальную альтернативу.
Re: что думаете про функциональные if-else, switch, for, while ?
Здравствуйте, niXman, Вы писали:
X>привет!
X>мне часто хочется функциональных if и switch. X>что-то типа: X>... X>auto res = switch ( idx) { X> case 0: { /* some code */; return 33; } X> case 1: { /* some code */; return 44; } X> default: return -1; X>} X>[/ccode] X>по поводу циклов, не знаю, нужно ли оно...
X>какие мысли?
Может я чего-то не понял, но чем это от обычных лямбд отличается? Что-то вроде:
auto res = []( auto idx ) { switch( idx ) {
case 0: { /* some code */; return 33; }
case 1: { /* some code */; return 44; }
}}( idx );
Можно в макрос завернуть, чтобы idx не писать несколько раз.
Re[2]: что думаете про функциональные if-else, switch, for, while ?
Здравствуйте, watchmaker, Вы писали:
W>Кажется, это должно работать так: если хочется что-то добавить в язык, то желательно сделать прототип, попробовать им воспользоваться, собрать шишки, и если опыт окажется удачным, то внести предложение в комитет (можно, конечно, и без прототипа, но это даст меньше шансов, если польза от предложения не очевидна сразу всем).
логично.
W>И вот эта идея на самом деле уже реализована много-много лет назад, как минимум в трёх известных компиляторах (gcc/clang/icc) под названием Statements and Declarations in Expressions.
всегда думал, что это только в GCC поддерживается, потому никогда и не использовал...
к тому же, синтаксис еще ужасней чем при использовании лямбд %)
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Re[2]: что думаете про функциональные if-else, switch, for, while ?
Здравствуйте, niXman, Вы писали:
X>мне часто хочется функциональных if и switch. X>что-то типа: X> X>какие мысли?
ИМО, к функциональщине это имеет лишь опосредованное отношение. Это называется if-expression, switch-expression. (обычные называются if-statement, switch-statement)
If-expression кстати есть в C++, называется conditional expression/operator condtition ? true-expression : false-expression.
Также есть оператор запятая.
И конечно, как уже упомянули выше, вызов лямбды/замыкания — это тоже выражение, а уж внутри может быть что угодно.
Re[2]: что думаете про функциональные if-else, switch, for,
Здравствуйте, uzhas, Вы писали:
X>>мне часто хочется функциональных if и switch. U>чуток не по теме U>идет подмена понятий U>функциональный if — это паттерн матчинг (он же декларативный получается)
Он не про pattern matching, а про if-expression. В некоторых языках if это expression (по типу condtition ? true-expression : false-expression в C++), а не statement, со всеми вытекающими. Причём не только if, но и другие условные конструкции, и например блоки кода.
мне часто хочется функциональных if и switch.
что-то типа:
auto res = if (1) {
// some codereturn 1;
} else {
// some codereturn 0;
}
auto res = switch ( idx) {
case 0: { /* some code */; return 33; }
case 1: { /* some code */; return 44; }
default: return -1;
}
по поводу циклов, не знаю, нужно ли оно...
какие мысли?
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Re[2]: что думаете про функциональные if-else, switch, for, while ?
Здравствуйте, SaZ, Вы писали:
SaZ>Может я чего-то не понял, но чем это от обычных лямбд отличается?
тем, что лямбды для данного случая — лечение последствий.
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Re[3]: что думаете про функциональные if-else, switch, for, while ?
Здравствуйте, niXman, Вы писали:
SaZ>>Может я чего-то не понял, но чем это от обычных лямбд отличается? X>тем, что лямбды для данного случая — лечение последствий.
Каких последствий?
Re[4]: что думаете про функциональные if-else, switch, for, while ?
Здравствуйте, niXman, Вы писали:
X>мне часто хочется функциональных if и switch.
чуток не по теме
идет подмена понятий
функциональный if — это паттерн матчинг (он же декларативный получается)
if в виде функции — это фигня какая-то )) по типу, как в tcl: http://wiki.tcl.tk/1042
Re[2]: что думаете про функциональные if-else, switch, for, while ?
Здравствуйте, uzhas, Вы писали:
U>if в виде функции — это фигня какая-то ))
это не фигня хотябы потому, что компилятор сможет проверять, во всех ли блоках происходит возврат значения.
и да, я знаю, это можно сделать при помощи тех же лямбд.
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Re[2]: что думаете про функциональные if-else, switch, for, while ?
Здравствуйте, Evgeny.Panasyuk, Вы писали:
EP>Здравствуйте, niXman, Вы писали:
X>>мне часто хочется функциональных if и switch. X>>что-то типа: X>> X>>какие мысли?
EP>ИМО, к функциональщине это имеет лишь опосредованное отношение. Это называется if-expression, switch-expression.
не знал. ок.
EP>If-expression кстати есть в C++, называется conditional expression/operator condtition ? true-expression : false-expression.
тернарка?
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Re[3]: что думаете про функциональные if-else, switch, for, while ?
Здравствуйте, Evgeny.Panasyuk, Вы писали:
EP>Он не про pattern matching, а про if-expression. В некоторых языках if это expression (по типу condtition ? true-expression : false-expression в C++), а не statement, со всеми вытекающими. Причём не только if, но и например блоки кода, и другие условные конструкции.
да-да, я об этом.
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Re[3]: что думаете про функциональные if-else, switch, for,
Здравствуйте, niXman, Вы писали:
X>ясно, пропосал никто писать не хочет =)
1) появляется желание (у тебя)
2) появляются велосипедные реализации (у меня и Евгения Панасюка)
3) нарабатывается практика использования (тебе надо, ты и используешь)
4) обнаруживаются подводные грабли, описываются истории успеха и всё такое
5) велосипед попадает в буст
6) буст попадает в пропозал
7) пропозал попадает в стандарт
Вот, как-то так.
Перекуём баги на фичи!
Re: что думаете про функциональные if-else, switch, for, while ?
return там не к месту. Это оператор немедленного выхода из функции.
если бы просто значение блока в фигурных скобках было бы равно значению последнего выражения в этом блоке, то да, была бы годная вещь.
auto res = if (1) {
// some code
1;
} else {
// some code
0;
}
Нет такого преступления, на которое не пошло бы суверенное родоплеменное быдло ради продления своего бессмысленного рода и распространения своего бессмысленного генома.
Re: что думаете про функциональные if-else, switch, for, while ?
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[2]: что думаете про функциональные if-else, switch, for, while ?
Здравствуйте, Went, Вы писали:
W>Здравствуйте, niXman, Вы писали:
X>>мне часто хочется функциональных if и switch. W>А мне часто хочется какого-то обобщенного широкого решения для всех этих разнородных и жалких операторов родом из 70-х (или даже раньше). Придумали десяток узких конструкций, которые, якобы, покрывают все необходимости программистов, а мы вынуждены подгонять под них наши алгоритмы. W>1. Теоретически, любой блок может иметь возвратное значение — хоть if, хоть for, хоть try. W>2. Теоретически, любой цикл-блок может иметь finally (если он закончился штатно, пройдя все итерации) и else/default (если из него выпали бряком) W>3. Теоретически, любой блок может иметь имя и список аргументов, по которому его можно позвать многократно, не создавая отдельной функции или лямбды. W>4. Теоретически, любой блок может иметь continue, отправляющий программу в начало блока. W>5. Теоретически, любой блок может иметь любое другое свойство любого другого блока, реализованное для другого вида блока. W>Не все композиции будут одинаково полезны, но текущая ситуация реально выглядит архаично, как будто всю мощь современного С++ стоит на каком-то школьном паскалеподобном диалекте.
вообще-то, структурное программирование и разрабатывалось, чтоб за счет ограничения свободы повысить читабельность и понизить шансы выстрелить в ногу.