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 ?
От: Кодт Россия  
Дата: 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: что думаете про функциональные if-else, switch, for, while ?
От: Went  
Дата: 28.04.17 18:17
Оценка: 1 (1) +2
Здравствуйте, niXman, Вы писали:

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

А мне часто хочется какого-то обобщенного широкого решения для всех этих разнородных и жалких операторов родом из 70-х (или даже раньше). Придумали десяток узких конструкций, которые, якобы, покрывают все необходимости программистов, а мы вынуждены подгонять под них наши алгоритмы.
1. Теоретически, любой блок может иметь возвратное значение — хоть if, хоть for, хоть try.
2. Теоретически, любой цикл-блок может иметь finally (если он закончился штатно, пройдя все итерации) и else/default (если из него выпали бряком)
3. Теоретически, любой блок может иметь имя и список аргументов, по которому его можно позвать многократно, не создавая отдельной функции или лямбды.
4. Теоретически, любой блок может иметь continue, отправляющий программу в начало блока.
5. Теоретически, любой блок может иметь любое другое свойство любого другого блока, реализованное для другого вида блока.
Не все композиции будут одинаково полезны, но текущая ситуация реально выглядит архаично, как будто всю мощь современного С++ стоит на каком-то школьном паскалеподобном диалекте.
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: что думаете про функциональные 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 ?
От: 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[2]: что думаете про функциональные if-else, switch, for, while ?
От: Evgeny.Panasyuk Россия  
Дата: 28.04.17 23:18
Оценка: +1 :)
Здравствуйте, Erop, Вы писали:

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

E>Image: 20100392.jpg
E>Наслаждайся

Так в случае Lisp'а за деревьямискобками леса не видно, к ним привыкать нужно же ж.
А так можно посмотреть на тот же Nemerle.
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,
От: 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: что думаете про функциональные 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
    };


можете поиграться, и понять насколько это вам будет удобнее.
что думаете про функциональные 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[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[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[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[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;
}
Нет такого преступления, на которое не пошло бы суверенное родоплеменное быдло ради продления своего бессмысленного рода и распространения своего бессмысленного генома.
Re: что думаете про функциональные if-else, switch, for, while ?
От: Erop Россия  
Дата: 28.04.17 23:09
Оценка:
Здравствуйте, niXman, Вы писали:

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



Наслаждайся
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[2]: что думаете про функциональные if-else, switch, for, while ?
От: _hum_ Беларусь  
Дата: 30.04.17 18:18
Оценка:
Здравствуйте, 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>Не все композиции будут одинаково полезны, но текущая ситуация реально выглядит архаично, как будто всю мощь современного С++ стоит на каком-то школьном паскалеподобном диалекте.

вообще-то, структурное программирование и разрабатывалось, чтоб за счет ограничения свободы повысить читабельность и понизить шансы выстрелить в ногу.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.