На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! Правила раздела:
1. Название темы - краткое описание кто/что против кого/чего
2. В первом сообщении - список параметров, по которым идет сравнение.
3. Старайтесь аргументировать свои высказывания. Фразы типа "Венда/Слюникс - ацтой" считаются флудом.
4. Давайте жить дружно и не доводить обсуждение до маразма и личных оскорблений.
Модераторы: Модераторы, Комодераторы
Страницы: (56) « Первая ... 9 10 [11] 12 13 ...  55 56  ( Перейти к последнему сообщению )  
> D vs C++ , почти сурковская пропаганда: не пора ли C++ потихоньку готовиться к пенсии?
    applegame, кстати, а если вместо первого аргумента будет вызов функции, она вызовется один раз и сохранит значение или будет вызываться на каждое сравнение? типа
    ExpandedWrap disabled
      int foo() {
        writeln 1;
        return 1;
      }
       
      void main() {
        isOneOf(foo(), 2 3, 1, 4, 5);
      }
      korvin, это не макросы. Совсем.
        Цитата applegame @
        Это переменные локальные для самой лямбды, внутренности find не имеют к ним никакого отношения. Не нравятся a и b, используй другие имена, главное два аргумента и возвращение значения, которое может быть неявно приведено к bool.

        Как тогда компилятор выясняет, какие идентификаторы в строке являются аргументами лямбды, а какие — нет? Или контекст вызова просто игнорируется и его также нужно явно передавать параметром?
        ExpandedWrap disabled
          int b = 3;
          find!"a.key == b"(foo, 2);


        Добавлено
        Цитата D_KEY @
        korvin, это не макросы. Совсем.

        Это не значит, что они могут самостоятельно решить, вызывать предварительно foo(), или нет.
        Сообщение отредактировано: korvin -
          Цитата D_KEY @
          Рано прощаешься, похоже, что он прав :)
          sensored, и ты туда же. Я эти рекурсивные шаблоны разбирал по косточкам, вплоть до ассемблера, когда баги в LLVM репортил. Инлайнирование функций (в обсуждаемом случае) полностью равнозначно разворачиванию рекурсии: превратит в тупую цепочку проверок. Причем итеративное решение приведет к такому же результату. То что функций будет много и компилятор их инлайнит - это вообще особенности компиляции, с функциональной точки зрения isOneOf в дешном варианте - одна функция с переменным числом аргументов, а не куча с разными сигнатурами.
          Сообщение отредактировано: Qraizer -
            Цитата applegame @
            с функциональной точки зрения isOneOf в дешном варианте - одна функция с переменным числом аргументов, а не куча с разными сигнатурами.

            оО
            Кстати, именно это как раз деталь реализации, даже если так D делает. А вот семантически там как раз совершенно разные вызовы. Разве нет?

            Ты не нервничай так, а то сам понимаешь, что будет с темой

            Добавлено
            Цитата korvin @
            Как тогда компилятор выясняет, какие идентификаторы в строке являются аргументами лямбды, а какие — нет? Или контекст вызова просто игнорируется и его также нужно явно передавать параметром?
            ExpandedWrap disabled
              int b = 3;
              find!"a.key == b"(foo, 2);

            Присоединяюсь к вопросу.
              Цитата applegame @
              То что функций будет много и компилятор из инлайнит - это вообще особенности компиляции

              То, что инлайнит - да, особенность компиляции. То, что функции разные - семантика языка. А если разные, то это не рекурсия просто по определению.
              Цитата applegame @
              с функциональной точки зрения isOneOf

              Что такое "функциональная точка зрения"?
              Цитата applegame @
              isOneOf в дешном варианте - одна функция с переменным числом аргументов

              Нет, ибо она параметризуется их типами. И потому это не просто переменное число аргументов - инстанцирование приводит к разным функциям хотя бы из-за проверки типов.
                Цитата D_KEY @
                Кстати, именно это как раз деталь реализации, даже если так D делает. А вот семантически там как раз совершенно разные вызовы. Разве нет?
                Нет D так не делает. Это будут разные функции. Так как CTFE, то фактически рекурсия разворачивается в итеративный вариант (с foreach) с последующим разворачиванием цикла в последовательность проверок.
                Оторвитесь уже, блджад, от плюсов. Представьте это математически: одна функция, рекурсивная, с переменным числом аргументов, вызывает сама себя.
                Сообщение отредактировано: applegame -
                  Цитата applegame @
                  рекурсия разворачивается

                  Так а где здесь рекурсия то? :rolleyes:
                    Цитата applegame @
                    Цитата D_KEY @
                    Кстати, именно это как раз деталь реализации, даже если так D делает. А вот семантически там как раз совершенно разные вызовы. Разве нет?
                    Нет D так не делает. Это будут разные функции.

                    Значит, нет и рекурсии.
                      Цитата applegame @
                      Представьте это математически: одна функция, рекурсивная

                      Мы представили. Математически мы не видим одной функции, мы видим метафункцию (шаблон), порождающую разные функции.

                      Добавлено
                      Метафункция рекурсивна, да. Порождённые ею функции - нет.
                      Сообщение отредактировано: MyNameIsIgor -
                        Тут вот есть рекурсия?
                        ExpandedWrap disabled
                          bool isOneOf__2(int a, int b) {
                              return a == b;
                          }
                           
                          bool isOneOf__3(int a, int b, int c) {
                              return isOneOf__2(a, b) || isOneOf__2(a, c);
                          }
                           
                          bool isOneOf__4(int a, int b, int c, int d) {
                              return isOneOf__2(a, b) || isOneOf__3(a, c, d);
                          }
                           
                          bool isOneOf__5(int a, int b, int c, int d, int e) {
                              return isOneOf__2(a, b) || isOneOf__4(a, c, d, e);
                          }
                          ...
                          Цитата korvin @
                          Цитата D_KEY @
                          korvin, это не макросы. Совсем.

                          Это не значит, что они могут самостоятельно решить, вызывать предварительно foo(), или нет.

                          Или «имеют право решать».

                          Пример, конечно, надуманый, но всякое ведь бывает. =)
                            Цитата korvin @
                            но всякое ведь бывает.

                            В C++ там идет обычный вызов функции, если что. Т.е. вся магия была на этапе инстанцирования шаблона функции. После инстанцирования ты вызываешь обычную функцию.
                              Цитата D_KEY @
                              В C++ там идет обычный вызов функции, если что. Т.е. вся магия была на этапе инстанцирования шаблона функции. После инстанцирования ты вызываешь обычную функцию.

                              Да я как бы вижу по результату и спрашивал не «почему так происходит». =)
                                Вот специально для вас. Тут будет ровно одна функция, вызывающая сама себя.
                                Математически одно и то же, скажите мне еще, что это не рекурсия: http://dpaste.dzfl.pl/3c5b2e014724
                                Хз хватит ли ума у компилятора D развернуть эту рекурсию в цикл. Но это не важно, важно чтобы стало понятно, о чем я.

                                Добавлено
                                Цитата korvin @
                                applegame, кстати, а если вместо первого аргумента будет вызов функции, она вызовется один раз и сохранит значение или будет вызываться на каждое сравнение? типа
                                Эм, я полагаю она вызовется один раз.
                                0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                0 пользователей:
                                Страницы: (56) « Первая ... 9 10 [11] 12 13 ...  55 56


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