что думаете про функциональные if-else, switch, for, while ?
От: niXman Ниоткуда https://github.com/niXman
Дата: 28.04.17 10:03
Оценка:
привет!

мне часто хочется функциональных if и switch.
что-то типа:
auto res = if (1) {
   // some code

   return 1;
} else {
   // some code

   return 0;
}


auto res = switch ( idx) {
   case 0: { /* some code */; return 33; }
   case 1: { /* some code */; return 44; }
   default: return -1;
}

по поводу циклов, не знаю, нужно ли оно...

какие мысли?
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Re: что думаете про функциональные if-else, switch, for, while ?
От: SaZ  
Дата: 28.04.17 10:09
Оценка: +2
Здравствуйте, 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 ?
От: Evgeny.Panasyuk Россия  
Дата: 28.04.17 10:25
Оценка:
Здравствуйте, SaZ, Вы писали:

SaZ>Можно в макрос завернуть, чтобы idx не писать несколько раз.


Достаточно сделать захват [&]{ ... }();
Re[2]: что думаете про функциональные if-else, switch, for, while ?
От: niXman Ниоткуда https://github.com/niXman
Дата: 28.04.17 10:26
Оценка:
Здравствуйте, SaZ, Вы писали:

SaZ>Может я чего-то не понял, но чем это от обычных лямбд отличается?

тем, что лямбды для данного случая — лечение последствий.
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Re[3]: что думаете про функциональные if-else, switch, for, while ?
От: Evgeny.Panasyuk Россия  
Дата: 28.04.17 10:28
Оценка:
Здравствуйте, niXman, Вы писали:

SaZ>>Может я чего-то не понял, но чем это от обычных лямбд отличается?

X>тем, что лямбды для данного случая — лечение последствий.

Каких последствий?
Re[4]: что думаете про функциональные if-else, switch, for, while ?
От: niXman Ниоткуда https://github.com/niXman
Дата: 28.04.17 10:29
Оценка:
Здравствуйте, Evgeny.Panasyuk, Вы писали:

EP>Каких последствий?

таких, что сабж нельзя использовать иначе.
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Re: что думаете про функциональные if-else, switch, for, while ?
От: uzhas Ниоткуда  
Дата: 28.04.17 10:32
Оценка:
Здравствуйте, niXman, Вы писали:

X>мне часто хочется функциональных if и switch.


чуток не по теме

идет подмена понятий
функциональный if — это паттерн матчинг (он же декларативный получается)
if в виде функции — это фигня какая-то )) по типу, как в tcl: http://wiki.tcl.tk/1042
Re: что думаете про функциональные if-else, switch, for, while ?
От: Evgeny.Panasyuk Россия  
Дата: 28.04.17 10:32
Оценка: +1
Здравствуйте, 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, while ?
От: niXman Ниоткуда https://github.com/niXman
Дата: 28.04.17 10:35
Оценка:
Здравствуйте, uzhas, Вы писали:

U>if в виде функции — это фигня какая-то ))

это не фигня хотябы потому, что компилятор сможет проверять, во всех ли блоках происходит возврат значения.

и да, я знаю, это можно сделать при помощи тех же лямбд.
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Re[2]: что думаете про функциональные if-else, switch, for, while ?
От: niXman Ниоткуда https://github.com/niXman
Дата: 28.04.17 10:36
Оценка:
Здравствуйте, 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[2]: что думаете про функциональные if-else, switch, for,
От: Evgeny.Panasyuk Россия  
Дата: 28.04.17 10:36
Оценка: :)
Здравствуйте, uzhas, Вы писали:

X>>мне часто хочется функциональных if и switch.

U>чуток не по теме
U>идет подмена понятий
U>функциональный if — это паттерн матчинг (он же декларативный получается)

Он не про pattern matching, а про if-expression. В некоторых языках if это expression (по типу condtition ? true-expression : false-expression в C++), а не statement, со всеми вытекающими. Причём не только if, но и другие условные конструкции, и например блоки кода.
Отредактировано 28.04.2017 10:37 Evgeny.Panasyuk . Предыдущая версия .
Re[3]: что думаете про функциональные if-else, switch, for, while ?
От: niXman Ниоткуда https://github.com/niXman
Дата: 28.04.17 10:37
Оценка:
Здравствуйте, Evgeny.Panasyuk, Вы писали:

EP>Он не про pattern matching, а про if-expression. В некоторых языках if это expression (по типу condtition ? true-expression : false-expression в C++), а не statement, со всеми вытекающими. Причём не только if, но и например блоки кода, и другие условные конструкции.


да-да, я об этом.
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Re: что думаете про функциональные if-else, switch, for, while ?
От: watchmaker  
Дата: 28.04.17 11:19
Оценка: 15 (2)
Здравствуйте, niXman, Вы писали:

X>какие мысли?


Кажется, это должно работать так: если хочется что-то добавить в язык, то желательно сделать прототип, попробовать им воспользоваться, собрать шишки, и если опыт окажется удачным, то внести предложение в комитет (можно, конечно, и без прототипа, но это даст меньше шансов, если польза от предложения не очевидна сразу всем).

И вот эта идея на самом деле уже реализована много-много лет назад, как минимум в трёх известных компиляторах (gcc/clang/icc) под названием Statements and Declarations in Expressions. Тот факт, что за это время этой возможностью серьёзно никто не заинтересовался, говорит лишь о том, что, видимо, такая функциональность никому особо и не нужна в стандарте языка. Тем более, что появившиеся с тех времён лямбды теперь предлагают достаточно универсальную альтернативу.
Re[2]: что думаете про функциональные if-else, switch, for, while ?
От: niXman Ниоткуда https://github.com/niXman
Дата: 28.04.17 11:25
Оценка: +2
Здравствуйте, watchmaker, Вы писали:

W>Кажется, это должно работать так: если хочется что-то добавить в язык, то желательно сделать прототип, попробовать им воспользоваться, собрать шишки, и если опыт окажется удачным, то внести предложение в комитет (можно, конечно, и без прототипа, но это даст меньше шансов, если польза от предложения не очевидна сразу всем).

логично.


W>И вот эта идея на самом деле уже реализована много-много лет назад, как минимум в трёх известных компиляторах (gcc/clang/icc) под названием Statements and Declarations in Expressions.

всегда думал, что это только в GCC поддерживается, потому никогда и не использовал...
к тому же, синтаксис еще ужасней чем при использовании лямбд %)
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Re: что думаете про функциональные if-else, switch, for, while ?
От: Кодт Россия  
Дата: 28.04.17 11:26
Оценка: 15 (2) +1
Здравствуйте, niXman, Вы писали:

X>привет!


X>мне часто хочется функциональных if и switch.

#define EXPRESS(...) BEGIN_EXPRESS __VA_ARGS__ END_EXPRESS
// на тот случай, если препроцессор на скобках внутри аргументов с ума сойдёт,
#define BEGIN_EXPRESS  ([&](){
#define END_EXPRESS    }())

int main() {
  cout << EXPRESS( cout << "hello"; if (1 > 2) return 123; cout << "world"; return 456; ) << endl;
  cout << BEGIN_EXPRESS
    cout << "hello";
    if (1 > 2) return 123;
    cout << "world";
    return 456;
  END_EXPRESS << endl;
}
Перекуём баги на фичи!
Re[2]: что думаете про функциональные if-else, switch, for,
От: Evgeny.Panasyuk Россия  
Дата: 28.04.17 11:34
Оценка: 131 (9) +1 :)
Здравствуйте, Кодт, Вы писали:

К>
К>#define EXPRESS(...) BEGIN_EXPRESS __VA_ARGS__ END_EXPRESS
К>


Тогда уж вот так:
int x = ${ if(1) return 42; else return 0; };

  Скрытый текст
LIVE DEMO
struct Aux
{
    template<typename F>
    auto operator*(F &&f)
    {
        return f();
    }
};

#define $ Aux{} * [&]
Отредактировано 28.04.2017 11:35 Evgeny.Panasyuk . Предыдущая версия .
Re: что думаете про функциональные if-else, switch, for, while ?
От: Zhendos  
Дата: 28.04.17 11:34
Оценка: +1
Здравствуйте, niXman, Вы писали:

X>привет!


X>мне часто хочется функциональных if и switch.

X>что-то типа:
X>
X>auto res = if (1) {
X>   // some code

X>   return 1;
X>} else {
X>   // some code

X>   return 0;
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>

X>по поводу циклов, не знаю, нужно ли оно...

X>какие мысли?


Есть язык похожий на C/C++ в плане синтаксиса,
где всё это уже реализовано:

    let boo = false;
    let foo = if boo {
        1
    } else {
        2
    };
    
    let foo2 = match foo {
        1 => 2,
        2 => 3,
        _ => -1,
    };
    
    let foo3 = {
        let a = 1;
        a + 3
    };


можете поиграться, и понять насколько это вам будет удобнее.
Re[3]: что думаете про функциональные if-else, switch, for,
От: niXman Ниоткуда https://github.com/niXman
Дата: 28.04.17 11:51
Оценка:
ясно, пропосал никто писать не хочет =)
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Re[4]: что думаете про функциональные if-else, switch, for,
От: Кодт Россия  
Дата: 28.04.17 13:02
Оценка:
Здравствуйте, niXman, Вы писали:

X>ясно, пропосал никто писать не хочет =)


1) появляется желание (у тебя)
2) появляются велосипедные реализации (у меня и Евгения Панасюка)
3) нарабатывается практика использования (тебе надо, ты и используешь)
4) обнаруживаются подводные грабли, описываются истории успеха и всё такое
5) велосипед попадает в буст
6) буст попадает в пропозал
7) пропозал попадает в стандарт

Вот, как-то так.
Перекуём баги на фичи!
Re: что думаете про функциональные if-else, switch, for, while ?
От: anonymouse2 Иностранный Агент
Дата: 28.04.17 15:28
Оценка:
Здравствуйте, niXman, Вы писали:

X>какие мысли?


return там не к месту. Это оператор немедленного выхода из функции.
если бы просто значение блока в фигурных скобках было бы равно значению последнего выражения в этом блоке, то да, была бы годная вещь.

auto res = if (1) {
   // some code
   1;
} else {
   // some code
   0;
}
Нет такого преступления, на которое не пошло бы суверенное родоплеменное быдло ради продления своего бессмысленного рода и распространения своего бессмысленного генома.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.