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

    Рекурсивно определение шаблона. Но не определения функций, порождаемых этим шаблоном.
      ExpandedWrap disabled
        bool isOneOf2(A, ARGS...)(A a, ARGS bb) {
            if(a == bb[0]) return true;
            static if(bb.length > 1) return isOneOf2(a, bb[1..$]);
            else return false;
        }


      vs

      ExpandedWrap disabled
        template<typename T, typename U>
        bool isOneOf(T a, U b) {
            return a == b;
        }
         
        template<typename T, typename U, typename ... Args>
        bool isOneOf(T a, U b, Args ... args) {
            return isOneOf(a, b) || isOneOf(a, args...);
        }


      Для меня второй вариант проще :) Хотя тут разницы-то нет.

      Цитата
      пришлось городить отдельную вспомогательную функцию, как я и думал.

      Почему вспомогательную? Это функция, которая берет два аргумента разных типов и сравнивает их :D
        Цитата D_KEY @
        Мне интересно, зачем итеративное определение в такого рода вещах.
        Иногда оно проще в реализации. С точки зрения эффективности разницы никакой.
          Цитата MyNameIsIgor @
          Цитата D_KEY @
          Это как посмотреть Определение-то рекурсивное.

          Рекурсивно определение шаблона. Но не определения функций, порождаемых этим шаблоном.

          Ага. А в D второй вариант вырождается именно в рекурсивные функции?
            Цитата D_KEY @
            А в D второй вариант вырождается именно в рекурсивные функции?

            Насколько я знаю, нет, тоже итеративный, не дженерики же :) Просто applegame не до конца понимают семантику того кода, который сам и написал :)
            Сообщение отредактировано: MyNameIsIgor -
              Цитата applegame @
              Не понимаю, к чему это? DMD, кстати компилирует гораздо быстрее GCC. Одна из фишек D - быстрая компиляция.

              Там опечатка, поправил.

              Цитата applegame @
              Но сама возможность доставляет

              Возможность сделать код непонятным? Кстати, как там с коллизией имен? Если внутри find уже будет переменная с именами «a» или «b» такого же типа, что и твои параметры?

              Цитата applegame @
              Оно, задача была проста. Но теперь сравниваем код, для D и для C++ и смотрим, что наглядней, легче для понимания и проще в написании.

              Конечно хаскелл и CL:
              ExpandedWrap disabled
                isOneOf1 _     [] = False
                isOneOf1 x (y:ys) = x == y || isOneOf1 x ys

              ExpandedWrap disabled
                (defmacro is-one-of (fn x &rest ys)
                  (find x ys :test fn))

              :P

              Добавлено
              Цитата applegame @
              Зачем? Это разве входило в условия задачи? Динамически только значения можно передавать. А длина и типы зафиксированы compile-time.

              Ну так не интересно.
                Цитата korvin @
                Конечно хаскелл

                Только это другая задача :)

                Добавлено
                Я вот совсем не знаю template haskell. Там никак во время компиляции не сделать?
                Сообщение отредактировано: D_KEY -
                  Цитата D_KEY @
                  Ага. А в D второй вариант вырождается именно в рекурсивные функции?
                  В debug-режиме, как правило да, как и в GCC например. В release оно разворачивает рекурсию, естественно. Я прекрасно знаю, что такое хвостовая рекурсия.
                    Цитата D_KEY @
                    Для меня второй вариант проще Хотя тут разницы-то нет.

                    Ну да, он же там три строчки то съэкономил, пожалел места :D В принципе так то и выходит что разницы нет =)
                      Цитата D_KEY @
                      Я вот совсем не знаю template haskell. Там никак во время компиляции не сделать?

                      Там много чего можно, это ж вроде почти как макросы CL, только типизированные. Т.е. наверное правильней сказать «как в Nemerle».
                      Только в чем сакральный смысл? Часто ты таким образом сравниваешь значения? Обычно, если их довольно много, то это рантайм-коллекция и всё придется делать в рантайме, а если мало, то овчинка выделки не стоит, обход массива в пяток значений просто копеечен по стоимости.
                        Цитата MyNameIsIgor @
                        Просто applegame не до конца понимают семантику того кода, который сам и написал :)
                        Ошибаешься. Посему тебе, лично - до свидания, не скучай ;)
                          Цитата applegame @
                          В debug-режиме, как правило да, как и в GCC например

                          Какая может быть рекурсия, если вызывается другая функция? :wacko:
                          Цитата applegame @
                          В release оно разворачивает рекурсию

                          Не разворачивает рекурсию, а инлайнит вызовы других функций.
                          Цитата applegame @
                          Я прекрасно знаю, что такое хвостовая рекурсия.

                          Серьёзно? Я не заметил...
                            Цитата Wound @
                            Ну да, он же там три строчки то съэкономил, пожалел места :D В принципе так то и выходит что разницы нет =)
                            Дык это только начало. :)
                              Цитата applegame @
                              Цитата MyNameIsIgor @
                              Просто applegame не до конца понимают семантику того кода, который сам и написал :)
                              Ошибаешься. Посему тебе, лично - до свидания, не скучай ;)

                              Рано прощаешься, похоже, что он прав :)

                              Добавлено
                              Цитата MyNameIsIgor @
                              Цитата applegame @
                              Я прекрасно знаю, что такое хвостовая рекурсия.

                              Серьёзно? Я не заметил...

                              Господа, при чем тут вообще хвостовая рекурсия сейчас? Давайте лучше холивар продолжим.
                                Цитата korvin @
                                Кстати, как там с коллизией имен? Если внутри find уже будет переменная с именами «a» или «b» такого же типа, что и твои параметры?
                                Ты о каких a и b. Вот этих?
                                ExpandedWrap disabled
                                  find!((a, b) => a.key == b)(foo, 1);
                                Это переменные локальные для самой лямбды, внутренности find не имеют к ним никакого отношения. Не нравятся a и b, используй другие имена, главное два аргумента и возвращение значения, которое может быть неявно приведено к bool.
                                0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                0 пользователей:
                                Страницы: (56) « Первая ... 8 9 [10] 11 12 ...  55 56


                                Рейтинг@Mail.ru
                                [ Script execution time: 0,0555 ]   [ 15 queries used ]   [ Generated: 18.06.25, 06:08 GMT ]