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

    Тут да. Потому что здесь нет зависимости аргументов шаблона от аргументов функции. Это есть шаблон функции с переменным числом параметров.
    А вот это
    ExpandedWrap disabled
      bool isOneOf2(A, ARGS...)(A a, ARGS bb)

    есть шаблон функции с переменным числом параметров разного типа. Если семантика (а не компилятор) D сводит второе к первому, то D убог. Но я не думаю, что он так делает.

    Добавлено
    applegame, можно ли в D сделать такую проверку? (грязный хак, знаю)
      Вообще это фактически пошел холивар терминов. Факт в том, что я прекрасно знаю, что такое разворачивание хвостовых рекурсий, как именно работают шаблонные функции, как они инлайнятся (зависит от компилятора и от опций компиляции). Если кто считает, что я в этом деле профан - ваше право так думать и заявлять об этом, а мое право сказать вам: "до свидания".
      А я тем временем вернусь к основному холивару и подгоню более сложную задачу.
      Сообщение отредактировано: applegame -
        Цитата applegame @
        Факт в том, что я прекрасно знаю, что такое разворачивание хвостовых рекурсий

        Только её здесь нет :jokingly:
          Цитата applegame @
          Вообще это фактически пошел холивар терминов. Факт в том, что я прекрасно знаю, что такое разворачивание хвостовых рекурсий, как именно работают шаблонные функции, как они инлайнятся (зависит от компилятора и от опций компиляции). Если кто считает, что я в этом деле профан - ваше право так думать и заявлять об этом, а мое право сказать вам: "до свидания".
          А я тем временем вернусь к основному холивару и подгоню более сложную задачу.

          А ты мог бы ответить на вопрос korvinа по поводу кода из строки и аргументов/захвата?
            Цитата MyNameIsIgor @
            applegame, можно ли в D сделать такую проверку? (грязный хак, знаю)
            Так устроит? http://dpaste.dzfl.pl/1e63ac0de3b5
            Цитата D_KEY @
            А ты мог бы ответить на вопрос korvinа по поводу кода из строки и аргументов/захвата?
            На что-то я уже отвечал, процитируй вопрос еще раз.
            Сообщение отредактировано: applegame -
              Цитата applegame @
              На что-то я уже отвечал, процитируй вопрос еще раз.

              D vs C++ (сообщение #3413091)

              Добавлено
              Цитата applegame @
              Так устроит? http://dpaste.dzfl.pl/1e63ac0de3b5

              Я думаю, Игорь имел в виду эту проверку: http://dpaste.dzfl.pl/7ee97716f99f
                Цитата korvin @
                Как тогда компилятор выясняет, какие идентификаторы в строке являются аргументами лямбды, а какие — нет? Или контекст вызова просто игнорируется и его также нужно явно передавать параметром?
                А, если предикат задан строкой, то имена жестко зафиксированы за "a" и "b". Дело в том, что D умеет компилировать выражение в строке (конечно, только если значение строки вычисляемо compile-time).

                Добавлено
                Цитата korvin @
                Я думаю, Игорь имел в виду эту проверку: http://dpaste.dzfl.pl/7ee97716f99f
                А в чем принципиальная разница?
                  Цитата applegame @
                  А в чем принципиальная разница?

                  Принципиальной разницы нет - функции разные.
                    Цитата applegame @
                    А в чем принципиальная разница?

                    Я не знаю, есть ли в D разница между твоим и моим примером, но, думаю, разные адреса намекают на разные функции, а кто-то утверждал, что функция одна.
                      Цитата MyNameIsIgor @
                      Принципиальной разницы нет - функции разные.
                      Это очевидно. При присвоении значения первому указателю, будут сгенерены две функции для двух и трех int. Для второго указателя сгенерится еще одна функция - для четырех int (для трех и двух уже нет необходимости, так как они уже есть). Если включить оптимизацию, то в готовом коде, вероятно, останутся только две функции: для трёх и для четырех int. Причем также вероятно, что та, что с четырмя не будет вызывать ту, что с тремя. Если компилер совсем крут, аки GCC, то в конечном коде функций может не быть совсем, все будет заинлайнено "в нули".

                      Добавлено
                      Цитата korvin @
                      а кто-то утверждал, что функция одна.
                      Господи, я же говорил, с математической точки зрения. Можете обзывать это метафункцией:
                      Цитата MyNameIsIgor @
                      Метафункция рекурсивна, да. Порождённые ею функции - нет.
                        Цитата applegame @
                        Цитата korvin @
                        Как тогда компилятор выясняет, какие идентификаторы в строке являются аргументами лямбды, а какие — нет? Или контекст вызова просто игнорируется и его также нужно явно передавать параметром?
                        А, если предикат задан строкой, то имена жестко зафиксированы за "a" и "b". Дело в том, что D умеет компилировать выражение в строке (конечно, только если значение строки вычисляемо compile-time).

                        Можно подробнее? И есть ли способ захвата контекста в ..эм.. строку?
                          Цитата applegame @
                          Это очевидно

                          Собственно, не понятно чем вы тогда весь такой недовольный. Я ведь говорил
                          Цитата MyNameIsIgor @
                          Рекурсивно определение шаблона. Но не определения функций, порождаемых этим шаблоном.
                            Цитата D_KEY @
                            Можно подробнее? И есть ли способ захвата контекста в ..эм.. строку?
                            Строка будет скомпилирована в контексте того места, где она собственно скомпилирована, простите за тавтологию. Ща приведу пример, может станет понятней.
                              Цитата applegame @
                              Господи, я же говорил, с математической точки зрения. Можете обзывать это метафункцией

                              С «математической» точки зрения у всех функций только один аргумент например. =)
                              Не знаю, зачем вообще надо было приплетать в обсуждение математику и какой «физический смысл» у этой «математической точки зрения» как в контексте обсуждения, так и для компиляторов.
                                Цитата MyNameIsIgor @
                                Собственно, не понятно чем вы тогда весь такой недовольный. Я ведь говорил
                                Я против этого не возражал. Случилось, вероятно, недопонимание. Предлагаю закрыть эту тему.

                                Добавлено
                                Цитата korvin @
                                С «математической» точки зрения у всех функций только один аргумент например. =)
                                Да, с ясностью выражения мыслей у меня иногда бывают проблемы, как собственно и у всех. Исключение разве что FlexFerrum, по крайней мере в темах о C++ :)
                                Цитата korvin @
                                Не знаю, зачем вообще надо было приплетать в обсуждение математику и какой «физический смысл» у этой «математической точки зрения» как в контексте обсуждения, так и для компиляторов.
                                Смысл был в ответе на вопрос корректно ли называть второе решение - рекурсивным? То, что оно семантически будет итеративным - вызов нескольких функций одна внутри другой - очевидно, но само решение, я считаю, можно вполне назвать рекурсивным.

                                Добавлено
                                Вот обещанный пример. Обратите внимание на удобство и простоту использования auto в качестве возвращаемого типа:
                                [URL=http://dpaste.dzfl.pl/82aacb91bb0b
                                ExpandedWrap disabled
                                  import std.conv;
                                   
                                  auto foo(string code)(int a, int b) {
                                      int c = a - b;
                                      return mixin(code);
                                  }
                                      
                                  void main() {
                                      assert( foo!("a + b")(1, 2) == 3 );
                                      assert( foo!("a == b")(1, 2) == false );
                                      assert( foo!("a + c")(1, 2) == 0 );
                                      assert( foo!("a.to!string ~ b.to!string")(1, 2) == "12" );
                                  }
                                ]http://dpaste.dzfl.pl/82aacb91bb0b
                                ExpandedWrap disabled
                                  import std.conv;
                                   
                                  auto foo(string code)(int a, int b) {
                                      int c = a - b;
                                      return mixin(code);
                                  }
                                      
                                  void main() {
                                      assert( foo!("a + b")(1, 2) == 3 );
                                      assert( foo!("a == b")(1, 2) == false );
                                      assert( foo!("a + c")(1, 2) == 0 );
                                      assert( foo!("a.to!string ~ b.to!string")(1, 2) == "12" );
                                  }
                                [/URL]

                                Добавлено
                                И да, на всякий случай, уточню: будет сгенерено четыре функции foo, для разных строковых параметров.
                                Сообщение отредактировано: applegame -
                                0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                0 пользователей:
                                Страницы: (56) « Первая ... 10 11 [12] 13 14 ...  55 56


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