Re[6]: boost::lambda, ещё вопросы
От: s.ts  
Дата: 17.05.11 21:11
Оценка: +1
Здравствуйте, Masterkent, Вы писали:

M>nen777w:


I>>>Я раньше думал, что использование лямбды должно упрощать код... Теперь в сомнениях...

N>>На самом деле почитав документацию всё становится достаточно понятно

M>Вот только понять, что делает нормальный читабельный код, можно гораздо быстрее. С поиском ошибки — если таковая возникла — аналогично.


I>>>Кроме того, что получилось в коде заюзать лямбду не детским образом, какие-нибудь дополнительные профиты это принесло?

N>>Мне просто интересно разобраться было.

M>Вот-вот, из академического интереса побаловаться можно, но чтобы использовать на практике — ну на фиг такое счастье.


N>>Из профитов гм.. например если lambda использовать совместно с <algorithm> это позволит не писать отдельных функторов, делать их сразу по месту.


M>Большое достижение, однако...


единственный профит, что я заметил по сравнению с boost::bind — там placeholers ведут себя иначе.
Можно вместо
std::find_if(... , ... , boost::bind( ...equal?, _1, 100500 ))
писать
std::find_if(... , ... , boost::lambda::_1 == 100500 )
ну и т.п.

как-то так.
Re: boost::lambda
От: Ka3a4oK  
Дата: 18.05.11 08:54
Оценка: +2
Мой совет — не используйте boost::lambda. Это будет сыпать непонятными сообщениями в случае какой-то ошибки и очень долго компилироваться.
Re[2]: boost::lambda
От: Ka3a4oK  
Дата: 18.05.11 08:56
Оценка:
Ну и естественно это будет нечитаемо и не неотлаживаемо.
Re[4]: boost::lambda, ещё вопросы
От: Ka3a4oK  
Дата: 19.05.11 20:38
Оценка: +2 :))) :)
N>
N>    unsigned int n = 0;
N>    bl::for_loop( bl::var(n) = 0, bl::var(n)<rc_ptidx.size()*2, ++bl::var(n), (
N>            bl::_1 = bl::var(axis_x)[bl::var(n)],
N>            bl::switch_statement( ( &bl::_1 ->* &axs_info::side)
N>                , bl::case_statement<s_left>( &bl::var(rc_ptidx)[(&bl::_1 ->* &axs_info::rc_index)] ->* &point_idx::idx_l = bl::var(n) )
N>                , bl::case_statement<s_right>( &bl::var(rc_ptidx)[(&bl::_1 ->* &axs_info::rc_index)] ->* &point_idx::idx_r = bl::var(n) )
N>            ) ,
N>            bl::switch_statement( ( &bl::var(axis_y)[bl::var(n)] ->* &axs_info::side)
N>                , bl::case_statement<s_top>( &bl::var(rc_ptidx)[(&bl::_1 ->* &axs_info::rc_index)] ->* &point_idx::idx_t = bl::var(n) )
N>                , bl::case_statement<s_bottom>( &bl::var(rc_ptidx)[(&bl::_1 ->* &axs_info::rc_index)] ->* &point_idx::idx_b = bl::var(n) )
N>            )
N>        ) 
N>    )();
N>


... << RSDN@Home 1.2.0 alpha 4 rev. 1472>>
Re[3]: boost::lambda
От: nen777w  
Дата: 19.05.11 22:47
Оценка:
Здравствуйте, Ka3a4oK, Вы писали:

KK>Мой совет — не используйте boost::lambda. Это будет сыпать непонятными сообщениями в случае какой-то ошибки и очень долго компилироваться.


Сообщение об ошибках действительно не совсем что бы читаемы. Но всегда можно выделить кусок в котором происходит ошибка и постараться понять почему она происходит.
Потом с опытом ошибок становится намного меньше а со временем исчезают совсем.

KK>Ну и естественно это будет нечитаемо и не неотлаживаемо.


Да нормально всё с этой lambda. Ну да синтаксис сложноват. Но если вникнуть то не так и сложно на самом деле.
Я вокруг неё достаточно долго ходил, синтаксис очень отпугивал, больше предпочитал boost::bind.
Потом вдруг захотелось разобраться, один выходной и все стало значительно понятней.
Re[4]: boost::lambda, ещё вопросы
От: jazzer Россия Skype: enerjazzer
Дата: 21.05.11 13:34
Оценка: +1
Здравствуйте, _nn_, Вы писали:

__>Здравствуйте, nen777w, Вы писали:


N>>Более сложные приём использования этой офигенной библиотеки, думаю также будут полезны ещё кому-то.

__>+1

__>А может просто убедите начальство переходить на GCC 4.5 / VS 2010 а там и нормальные лямбды есть


Что такое "нормальные лямбды"? Имхо, нормальные лямбды — это полиморфные, а не то, что в С++0х, когда надо явно типы прописывать.
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re[4]: boost::lambda, ещё вопросы
От: MasterZiv СССР  
Дата: 28.05.11 17:44
Оценка:
On 09.05.2011 19:10, ilvi wrote:

> Я раньше думал, что использование лямбды должно упрощать код... Теперь в

> сомнениях...

везде, кроме С++.
Posted via RSDN NNTP Server 2.1 beta
Re[5]: boost::lambda, ещё вопросы
От: MasterZiv СССР  
Дата: 28.05.11 17:45
Оценка:
On 09.05.2011 20:37, nen777w wrote:

> На самом деле почитав документацию всё становится достаточно понятно, так что

> страшных закорючек бояться не стоит. Люди вот например как то же пишут на Perl-е
> а там синтаксис по круче будет.

Пишут, запускают, работает, что надо исправить -- пишут снова с нуля,
потому как разобраться уже невозможно. Ты тоже так хочешь ?
Posted via RSDN NNTP Server 2.1 beta
Re[7]: boost::lambda, ещё вопросы
От: ArtDenis Россия  
Дата: 30.05.11 03:56
Оценка:
Здравствуйте, s.ts, Вы писали:

ST>единственный профит, что я заметил по сравнению с boost::bind — там placeholers ведут себя иначе.

ST>Можно вместо
ST>std::find_if(... , ... , boost::bind( ...equal?, _1, 100500 ))
ST> писать
ST>std::find_if(... , ... , boost::lambda::_1 == 100500 )
ST>ну и т.п.

Нет, это неверно. boost::bind также поддерживает простые операторы сравнения и логические операторы: http://www.boost.org/doc/libs/1_46_1/libs/bind/bind.html#operators
[ 🎯 Дартс-лига Уфы | 🌙 Программа для сложения астрофото ]
Re[5]: boost::lambda, ещё вопросы
От: ArtDenis Россия  
Дата: 30.05.11 03:57
Оценка:
Здравствуйте, jazzer, Вы писали:

J>Что такое "нормальные лямбды"? Имхо, нормальные лямбды — это полиморфные, а не то, что в С++0х, когда надо явно типы прописывать.


IMHO лучше типы прописывать, чем извращаться с boost::lambda
[ 🎯 Дартс-лига Уфы | 🌙 Программа для сложения астрофото ]
Re[6]: boost::lambda, ещё вопросы
От: jazzer Россия Skype: enerjazzer
Дата: 30.05.11 05:07
Оценка: 1 (1)
Здравствуйте, ArtDenis, Вы писали:

AD>Здравствуйте, jazzer, Вы писали:


J>>Что такое "нормальные лямбды"? Имхо, нормальные лямбды — это полиморфные, а не то, что в С++0х, когда надо явно типы прописывать.


AD>IMHO лучше типы прописывать, чем извращаться с boost::lambda


хмм...
что читабельнее:
std::sort( v.begin(), v.end(), _1 < _2 );

или
std::sort( v.begin(), v.end(), []( Vector::const_reference a, Vector::const_reference b ) { a < b; } );

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

Еще пример:
auto f = _1 += _2;
int ia, ib;
std::string sa, sb;
f( ia, ib );
f( sa, sb );

сможешь повторить на лябмдах C++0x?
а ведь лябмды именно такого типа нужны для работы с гетерогенными контейнерами типа boost::fusion::vector.
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re[8]: boost::lambda, ещё вопросы
От: s.ts  
Дата: 30.05.11 06:43
Оценка: +1
Здравствуйте, ArtDenis, Вы писали:

AD>Здравствуйте, s.ts, Вы писали:


ST>>единственный профит, что я заметил по сравнению с boost::bind — там placeholers ведут себя иначе.

ST>>Можно вместо
ST>>std::find_if(... , ... , boost::bind( ...equal?, _1, 100500 ))
ST>> писать
ST>>std::find_if(... , ... , boost::lambda::_1 == 100500 )
ST>>ну и т.п.

AD>Нет, это неверно. boost::bind также поддерживает простые операторы сравнения и логические операторы: http://www.boost.org/doc/libs/1_46_1/libs/bind/bind.html#operators


Нет, это верно
Разница в поведении placeholders.
В boost::bind простые операторы не определены для placeholders.
Т.е. нельзя написать _1 == 1, но можно писать что-то типа boost::bind(&C::f, _1) == _2
А в лямбде именно для placeholders определены элементарные операторы.

Вот минимальный код:
#include <boost/bind.hpp>
#include <boost/lambda/lambda.hpp>
#include <vector>
#include <algorithm>

void f() {
    std::vector<int> v;
    std::find_if(v.begin(), v.end(), boost::lambda::_1 == 3 ); // тут все Ok
    std::find_if(v.begin(), v.end(), _1 == 3 ); // тут ошибка компиляции error: no match for ‘operator==’ in ‘<unnamed>::_1 == 3’
}
Re[9]: boost::lambda, ещё вопросы
От: ArtDenis Россия  
Дата: 30.05.11 17:13
Оценка:
Здравствуйте, s.ts, Вы писали:

ST>Нет, это верно


Да, извиняюсь. Не заметил, что оператор сравнения в примере применялся к плейсхолдеру
[ 🎯 Дартс-лига Уфы | 🌙 Программа для сложения астрофото ]
Re[7]: boost::lambda, ещё вопросы
От: ArtDenis Россия  
Дата: 30.05.11 17:16
Оценка:
Здравствуйте, jazzer, Вы писали:

J>что читабельнее:

J>
J>std::sort( v.begin(), v.end(), _1 < _2 );
J>

J>или
J>
J>std::sort( v.begin(), v.end(), []( Vector::const_reference a, Vector::const_reference b ) { a < b; } );
J>

J>Или это ты первое называешь извращениями? Имхо, извращение — как раз второе.
J>И очень жаль, что комитет не смог родить в срок полиморфные лябмды (хоть они, естественно, не спорят с тем, что они нужны).

Первый читабельнее. Но это очень простой вариант, поэтому он выглядит более выигрышным. Но если потребуется что-то посложнее простого сравнения, то безымянные ф-ции С++0х уже начинают рулить.
[ 🎯 Дартс-лига Уфы | 🌙 Программа для сложения астрофото ]
Re[8]: boost::lambda, ещё вопросы
От: jazzer Россия Skype: enerjazzer
Дата: 30.05.11 19:12
Оценка:
Здравствуйте, ArtDenis, Вы писали:

AD>Здравствуйте, jazzer, Вы писали:


J>>что читабельнее:

J>>
J>>std::sort( v.begin(), v.end(), _1 < _2 );
J>>

J>>или
J>>
J>>std::sort( v.begin(), v.end(), []( Vector::const_reference a, Vector::const_reference b ) { return a < b; } );
J>>

J>>Или это ты первое называешь извращениями? Имхо, извращение — как раз второе.
J>>И очень жаль, что комитет не смог родить в срок полиморфные лябмды (хоть они, естественно, не спорят с тем, что они нужны).

AD>Первый читабельнее. Но это очень простой вариант, поэтому он выглядит более выигрышным. Но если потребуется что-то посложнее простого сравнения, то безымянные ф-ции С++0х уже начинают рулить.


Он и является выигрышным. Нужны полиморфные лямбды, встроенные в язык, тогда все будет супер.
И тот же пример будет выглядеть так (как вариант):
std::sort( v.begin(), v.end(), []( auto a, auto b ) { return a < b; } );

можно и другие варианты придумать:
std::sort( v.begin(), v.end(), [auto T]( T a, T b ) { return a < b; } );


Потом драконовское ограничение на выведение возвращаемого типа тоже мне не совсем понятно
Т.е. в примере выше он выведется, а в чуть переделанном — уже нет, потому что тело не записано в форме return expression:
std::sort( v.begin(), v.end(), []( Vector::const_reference a, Vector::const_reference b )
           { bool ret = a < b; return ret; } );

Зачем такое ограничение — хз.

В общем, не о чем спорить, имхо. Фича в С++0х отсутствует, и все это признают, в самом предложении написано, что эти лямбды — monomorphic, и есть соображения о создании полиморфных лямбд, которые как-то (не помню уже, как) конфликтовали c концептами (которые не вошли все равно).
Так что единственный вариант (кроме ручного кодирования) на сегодняшний день для полиморфного функтора — это Boost.Lambda (ну или грядущий Boost.Phoenix).
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re[9]: boost::lambda, ещё вопросы
От: FR  
Дата: 31.05.11 09:45
Оценка:
Здравствуйте, jazzer, Вы писали:

AD>>Первый читабельнее. Но это очень простой вариант, поэтому он выглядит более выигрышным. Но если потребуется что-то посложнее простого сравнения, то безымянные ф-ции С++0х уже начинают рулить.


J>Он и является выигрышным. Нужны полиморфные лямбды, встроенные в язык, тогда все будет супер.


Вообще-то эти вещи друг-другу не мешают, неплохо бы и частичное применение как в первом варианте
(или лучше с поддержкой компилятора: _ < _) и нормальные лямбды.
Re[9]: boost::lambda, ещё вопросы
От: _nn_ www.nemerleweb.com
Дата: 31.05.11 10:06
Оценка:
Здравствуйте, jazzer, Вы писали:

J>Так что единственный вариант (кроме ручного кодирования) на сегодняшний день для полиморфного функтора — это Boost.Lambda (ну или грядущий Boost.Phoenix).


Когда уже выйдет этот Boost.Phoenix ? Все ждем..
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[10]: boost::lambda, ещё вопросы
От: jazzer Россия Skype: enerjazzer
Дата: 31.05.11 10:08
Оценка:
Здравствуйте, _nn_, Вы писали:

__>Здравствуйте, jazzer, Вы писали:


J>>Так что единственный вариант (кроме ручного кодирования) на сегодняшний день для полиморфного функтора — это Boost.Lambda (ну или грядущий Boost.Phoenix).


__>Когда уже выйдет этот Boost.Phoenix ? Все ждем..


Да вроде планировали на след. неделе слепить boost 1.47.0, там он уже будет...
А пока можно полюбоваться на то, как с ним работать, см. презентацию с BoostCon'11 в соседнем форуме
Proto рулит
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re[11]: boost::lambda, ещё вопросы
От: _nn_ www.nemerleweb.com
Дата: 31.05.11 12:09
Оценка:
Здравствуйте, jazzer, Вы писали:

J>Здравствуйте, _nn_, Вы писали:


__>>Здравствуйте, jazzer, Вы писали:


J>>>Так что единственный вариант (кроме ручного кодирования) на сегодняшний день для полиморфного функтора — это Boost.Lambda (ну или грядущий Boost.Phoenix).


__>>Когда уже выйдет этот Boost.Phoenix ? Все ждем..


J>Да вроде планировали на след. неделе слепить boost 1.47.0, там он уже будет...

О как.
Ждем.

Т.е. Boost.Lambda, Boost.Bind скоро можно будет выкинуть ?

J>А пока можно полюбоваться на то, как с ним работать, см. презентацию с BoostCon'11 в соседнем форуме

J>Proto рулит

<offtop>Лучше бы уже С++ улучшили, чтобы не делать такие извращения.</offtop>
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[12]: boost::lambda, ещё вопросы
От: jazzer Россия Skype: enerjazzer
Дата: 31.05.11 13:35
Оценка:
Здравствуйте, _nn_, Вы писали:

__>Т.е. Boost.Lambda, Boost.Bind скоро можно будет выкинуть ?


Вроде как. У лямбды своих чисто технических проблем хватает, и я надеюсь, что Феникс их решит. Вроде как все к тому шло.

J>>А пока можно полюбоваться на то, как с ним работать, см. презентацию с BoostCon'11 в соседнем форуме

J>>Proto рулит

__><offtop>Лучше бы уже С++ улучшили, чтобы не делать такие извращения.</offtop>


Ну чтоб улучшить С++ до такого уровня, чтоб Прото с Фениксом стал не нужен — это реолючия целая, сравнимая с концепцтами по масштабам.
Хотя я бы не отказался, конечно
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.