Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[13.58.82.79] |
|
Страницы: (5) [1] 2 3 ... Последняя » все ( Перейти к последнему сообщению ) |
Сообщ.
#1
,
|
|
|
Знаешь, на ассемблере ведь тоже можно написать веб-сервер, но что-то никто желания пока не изъявлял. Спасибо, но меня воротит от плюсового синтаксиса в области шаблонов. Я асм легче читаю, чем такой код. Выглядит эта возможность именно костылем. Уродливо т. е. Раз уж все равно в оффтоп скатились, может, померяемся стандартными библиотеками? Как там у вас в плюсах/дельфях/питоне удаляют элементы из контейнера? Хочу удалить четыре последних элемента, кратных трем. Прошу заметить, что первая строчка всего лишь инициализирует последовательность. (setq a (loop for i from 1 to 32 collect i)) (remove 0 a :count 4 :from-end t :key #'(lambda (x) (mod x 3))) Ну давайте ваши лямбды сюда! Добавлено Кстати, лямбды в питоне, кажется есть и вроде даже адекватные. Это сообщение было перенесено сюда или объединено из темы "Python vs Delphi" |
Сообщ.
#2
,
|
|
|
Цитата linuxfan @ Выглядит эта возможность именно костылем. Уродливо т. е. Ткни пальцем в уродливость... Это сообщение было перенесено сюда или объединено из темы "Python vs Delphi" |
Сообщ.
#3
,
|
|
|
Кстати, а в каком языке лямбда может быть lecsical closure (т. е. захватывать биндинги из точки основания)? Мне на ум приходит только Java с ее anonymous (так чтоли называются?) классами.
А в плюсах лямбды -- это чистой воды костыль. C++ и Delphi вообще языки с полустатической типизацией. Как их можно с Python сравнивать? Добавлено Цитата Flex Ferrum @ Ткни пальцем в уродливость... Приведи пример кода, удаляющий все четные элементы из вектора с лямбдами. Это сообщение было перенесено сюда или объединено из темы "Python vs Delphi" |
Сообщ.
#4
,
|
|
|
Цитата linuxfan @ Кстати, а в каком языке лямбда может быть lecsical closure (т. е. захватывать биндинги из точки основания)? Мне на ум приходит только Java с ее anonymous (так чтоли называются?) классами. Например, в тех же плюсах. Используя boost::lambda::var, boost::lambda::constant, boost::lambda::constant_ref. Цитата linuxfan @ Приведи пример кода, удаляющий все четные элементы из вектора с лямбдами. std::vector<int> vec; vec.erase( std::remove_if( vec.begin(), vec.end(), _1 % 2 == 0 ), vec.end() ); Это сообщение было перенесено сюда или объединено из темы "Python vs Delphi" |
Сообщ.
#5
,
|
|
|
Цитата linuxfan @ Приведи пример кода, удаляющий все четные элементы из вектора с лямбдами. Пожалуйте: using namespace lambda; std::vector<int> v(20); for (int n = 0; n < v.size(); ++ n) v[n] = n; std::for_each(v.begin(), v.end(), std::cout << _1 << "\n"); std::cout << std::endl; v.erase(std::remove_if(v.begin(), v.end(), (_1 % 2) == 0), v.end()); std::for_each(v.begin(), v.end(), std::cout << _1 << "\n"); Выдает законные: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 1 3 5 7 9 11 13 15 17 19 Добавлено Если интересно - приведу ассемблерный листиг любого из for_each. Дабы не было кивков в сторону "накладных расходов". Это сообщение было перенесено сюда или объединено из темы "Python vs Delphi" |
Сообщ.
#6
,
|
|
|
А теперь удалять только последние 4, кратные трем
Думаю, что беспокойство доставит удалить именно «последние четыре» Мне интересно, как это выглядит. Насколько близко это будет по простоте к (delete 0 a :count 4 :from-end t :key #'(lambda (x) (mod x 3))) Добавлено Цитата Flex Ferrum @ Дабы не было кивков в сторону "накладных расходов". Сейчас я к накладным расходам придираться не буду, ибо в lisp'е их по определению больше. Это сообщение было перенесено сюда или объединено из темы "Python vs Delphi" |
Сообщ.
#7
,
|
|
|
Цитата linuxfan @ А теперь удалять только последние 4, кратные трем Это, конечно, к лямбдам не относится, а скорее к алгоритмам, но... std::vector<int> vec; vec.erase( std::remove_if( vec.size()<4?vec.begin():vec.end()-4, vec.end(), (_1 % 3) == 0 ), vec.end() ); Это сообщение было перенесено сюда или объединено из темы "Python vs Delphi" |
Сообщ.
#8
,
|
|
|
Что вам хочется увидеть из того, что на ваш взгляд элегеантно реализуется в плюсах?
|
Сообщ.
#9
,
|
|
|
mo3r, э нет. Это удалит все элементы, кратные трем из последних четырех.
Я прошу четыре последних элемента, кратные трем. Может в соседнюю тему переедем? Там вы меня попросите что-нибудь изобразить Только не слишком сложное -- lisp это хобби Это сообщение было перенесено сюда или объединено из темы "Python vs Delphi" |
Сообщ.
#10
,
|
|
|
Цитата linuxfan @ Я прошу четыре последних элемента, кратные трем. for (int n = 0; n < 4; ++ n) { std::vector<int>::reverse_iterator p = std::find_if(v.rbegin(), v.rend(), (_1 % 3) == 0); if (p != v.rend()) v.erase((++p).base()); } Это сообщение было перенесено сюда или объединено из темы "Python vs Delphi" |
Сообщ.
#11
,
|
|
|
Я так и знал, что в плюсах это будет выглядеть более монструозно.
Кстати, я бы соптимизировал for (int n = 0; n < 4; ++ n) { std::vector<int>::reverse_iterator p = std::find_if(v.rbegin(), v.rend(), (_1 % 3) == 0); if (p != v.rend()) v.erase((++p).base()); else break; } Но все-таки тут нед лямбда-функций в чистом виде. Это больше похоже на частный случай для предикатов. |
Сообщ.
#12
,
|
|
|
Цитата linuxfan @ Но все-таки тут нед лямбда-функций в чистом виде. Это больше похоже на частный случай для предикатов. А что значит "лямда-функций в чистом виде"? Вопрос из за того, что с синтаксисом лиспа я не знаком. По этому если ты пояснишь что какая конструкция в твоей строчке: Цитата linuxfan @ (delete 0 a :count 4 :from-end t :key #'(lambda (x) (mod x 3))) обозначает - будет здорово. |
Сообщ.
#13
,
|
|
|
Цитата linuxfan @ mo3r, э нет. Это удалит все элементы, кратные трем из последних четырех. Значит, я неправильно понял. using namespace boost::lambda;//в прошлых примерах я забыл про это std::vector<int> vec; int count = 0; vec.erase( std::remove_if( vec.rbegin(), vec.rend(), (_1 % 3) == 0 && var(count)++ < 4 ), vec.end() ); Цитата linuxfan @ Может в соседнюю тему переедем? Там вы меня попросите что-нибудь изобразить Только не слишком сложное -- lisp это хобби Тут уж я вряд ли смогу что-то сказать . Лисп я не особо знаю, но, думаю, что там можно многое. |
Сообщ.
#14
,
|
|
|
Цитата mo3r @ Значит, я неправильно понял. Не, не проканает. Предикат не имеет право иметь состояние. А в данном случае count - это состояние предиката, хоть и неявное. |
Сообщ.
#15
,
|
|
|
Цитата linuxfan @ Но все-таки тут нед лямбда-функций в чистом виде. Что значит --- в чистом виде? boost::lambda позволяет делать лямбды с if-ами, тернарным оператором, с киданием-ловлей исключений, с switch-case, for, while, do-while, конструкторами, деструкторами. Только goto нету (AFAIK). Добавлено Цитата Flex Ferrum @ Не, не проканает. Предикат не имеет право иметь состояние. А в данном случае count - это состояние предиката, хоть и неявное. Хм. Действительно... |