На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! Правила раздела:
1. Название темы - краткое описание кто/что против кого/чего
2. В первом сообщении - список параметров, по которым идет сравнение.
3. Старайтесь аргументировать свои высказывания. Фразы типа "Венда/Слюникс - ацтой" считаются флудом.
4. Давайте жить дружно и не доводить обсуждение до маразма и личных оскорблений.
Модераторы: Модераторы, Комодераторы
Страницы: (5) [1] 2 3 ... Последняя » все  ( Перейти к последнему сообщению )  
> Lisp vs C++ , померяемся?
    Цитата Flex Ferrum @
    Это означает, что эти функции могут быть реализованы средставми языка.

    Знаешь, на ассемблере ведь тоже можно написать веб-сервер, но что-то никто желания пока не изъявлял.
    Спасибо, но меня воротит от плюсового синтаксиса в области шаблонов. Я асм легче читаю, чем такой код.
    Цитата Flex Ferrum @
    По этому про "костыли" - не надо.

    Выглядит эта возможность именно костылем. Уродливо т. е.

    Раз уж все равно в оффтоп скатились, может, померяемся стандартными библиотеками?
    Как там у вас в плюсах/дельфях/питоне удаляют элементы из контейнера?
    Хочу удалить четыре последних элемента, кратных трем.
    Прошу заметить, что первая строчка всего лишь инициализирует последовательность.
    ExpandedWrap disabled
      (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"
      Цитата linuxfan @
      Выглядит эта возможность именно костылем. Уродливо т. е.

      Ткни пальцем в уродливость...

      Это сообщение было перенесено сюда или объединено из темы "Python vs Delphi"
        Кстати, а в каком языке лямбда может быть lecsical closure (т. е. захватывать биндинги из точки основания)? Мне на ум приходит только Java с ее anonymous (так чтоли называются?) классами.
        А в плюсах лямбды -- это чистой воды костыль.
        C++ и Delphi вообще языки с полустатической типизацией. Как их можно с Python сравнивать?

        Добавлено
        Цитата Flex Ferrum @
        Ткни пальцем в уродливость...

        Приведи пример кода, удаляющий все четные элементы из вектора с лямбдами.

        Это сообщение было перенесено сюда или объединено из темы "Python vs Delphi"
          Цитата linuxfan @
          Кстати, а в каком языке лямбда может быть lecsical closure (т. е. захватывать биндинги из точки основания)? Мне на ум приходит только Java с ее anonymous (так чтоли называются?) классами.

          Например, в тех же плюсах. Используя boost::lambda::var, boost::lambda::constant, boost::lambda::constant_ref.
          Цитата linuxfan @
          Приведи пример кода, удаляющий все четные элементы из вектора с лямбдами.

          ExpandedWrap disabled
            std::vector<int> vec;
            vec.erase(
              std::remove_if(
                vec.begin(),
                vec.end(),
                _1 % 2 == 0
              ),
              vec.end()
            );


          Это сообщение было перенесено сюда или объединено из темы "Python vs Delphi"
          Сообщение отредактировано: mo3r -
            Цитата linuxfan @
            Приведи пример кода, удаляющий все четные элементы из вектора с лямбдами.

            Пожалуйте:
            ExpandedWrap disabled
                  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");

            Выдает законные:
            ExpandedWrap disabled
              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"
              А теперь удалять только последние 4, кратные трем :)
              Думаю, что беспокойство доставит удалить именно «последние четыре» :)
              Мне интересно, как это выглядит. Насколько близко это будет по простоте к
              ExpandedWrap disabled
                (delete 0 a :count 4 :from-end t :key #'(lambda (x) (mod x 3)))


              Добавлено
              Цитата Flex Ferrum @
              Дабы не было кивков в сторону "накладных расходов". :)

              Сейчас я к накладным расходам придираться не буду, ибо в lisp'е их по определению больше.

              Это сообщение было перенесено сюда или объединено из темы "Python vs Delphi"
                Цитата linuxfan @
                А теперь удалять только последние 4, кратные трем :)

                Это, конечно, к лямбдам не относится, а скорее к алгоритмам, но...
                ExpandedWrap disabled
                  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"
                Сообщение отредактировано: mo3r -
                  Что вам хочется увидеть из того, что на ваш взгляд элегеантно реализуется в плюсах?
                    mo3r, э нет. Это удалит все элементы, кратные трем из последних четырех.
                    Я прошу четыре последних элемента, кратные трем.
                    Может в соседнюю тему переедем? Там вы меня попросите что-нибудь изобразить :)
                    Только не слишком сложное -- lisp это хобби :)

                    Это сообщение было перенесено сюда или объединено из темы "Python vs Delphi"
                      Цитата linuxfan @
                      Я прошу четыре последних элемента, кратные трем.

                      ExpandedWrap disabled
                            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"
                        Я так и знал, что в плюсах это будет выглядеть более монструозно.
                        Кстати, я бы соптимизировал ;)
                        ExpandedWrap disabled
                              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;
                              }

                        Но все-таки тут нед лямбда-функций в чистом виде. Это больше похоже на частный случай для предикатов.
                          Цитата linuxfan @
                          Но все-таки тут нед лямбда-функций в чистом виде. Это больше похоже на частный случай для предикатов.

                          А что значит "лямда-функций в чистом виде"? Вопрос из за того, что с синтаксисом лиспа я не знаком. По этому если ты пояснишь что какая конструкция в твоей строчке:

                          Цитата linuxfan @
                          (delete 0 a :count 4 :from-end t :key #'(lambda (x) (mod x 3)))

                          обозначает - будет здорово.
                            Цитата linuxfan @
                            mo3r, э нет. Это удалит все элементы, кратные трем из последних четырех.

                            Значит, я неправильно понял.
                            ExpandedWrap disabled
                              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 это хобби :)

                            Тут уж я вряд ли смогу что-то сказать :) . Лисп я не особо знаю, но, думаю, что там можно многое.
                              Цитата mo3r @
                              Значит, я неправильно понял.

                              Не, не проканает. Предикат не имеет право иметь состояние. А в данном случае count - это состояние предиката, хоть и неявное.
                                Цитата linuxfan @
                                Но все-таки тут нед лямбда-функций в чистом виде.

                                Что значит --- в чистом виде? boost::lambda позволяет делать лямбды с if-ами, тернарным оператором, с киданием-ловлей исключений, с switch-case, for, while, do-while, конструкторами, деструкторами. Только goto нету (AFAIK).

                                Добавлено
                                Цитата Flex Ferrum @
                                Не, не проканает. Предикат не имеет право иметь состояние. А в данном случае count - это состояние предиката, хоть и неявное.

                                Хм. Действительно...
                                0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                0 пользователей:


                                Рейтинг@Mail.ru
                                [ Script execution time: 0,0805 ]   [ 16 queries used ]   [ Generated: 24.04.24, 03:37 GMT ]