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

      Код может и один. Но std::vector<> - не является типом, а java.util.Vector<> - является.

      Добавлено
      Цитата applegame @
      Потому что шарп тоже генерит для каждого типа свой код как и плюсы.

      Шарп может генерировать, а может не генерировать - это деталь реализации. С++ не может не генерировать.

      Цитата
      И в Rust такая вот фигня скомпилится?
      ExpandedWrap disabled
        template<int N>
        int test(int b) {
          if(b == 0) {
            return 0;
          } else {
            return test<N + 1>(b - 1);
          }
        }
            
        int main() {
           test<0>(5);
        }

      Я вообще не уверен, что в Rust можно числа пихать в качестве параметров.

      Добавлено
      Цитата applegame @
      Цитата D_KEY @
      Эм... Конечно не полиморфный. А foo - неполиморфная функция, потому, что это вообще не функция.
      Ну и назови мне хоть одно отличие от "настоящей" функции.

      Для начала назови общее. А то я не очень понимаю, как мне сравнить шаблон функции с функцией.
        Цитата D_KEY @
        Код может и один. Но std::vector<> - не является типом, а java.util.Vector<> - является.
        Опять же не согласен. Конечно обычные переменные в C++ не могут иметь "тип" std::vector<>, а вот полиморфные в шаблонах могут. Особенно это заметно в D:
        ExpandedWrap disabled
          void foo(T: Vector!E, E)(T vector)

        Очень хорошо видно, что T имеет тип Vector!E
        Цитата D_KEY @
        Шарп может генерировать, а может не генерировать - это деталь реализации. С++ не может не генерировать.
        И то и другое - деталь реализации. Со своими недостатками и преимуществами.

        Добавлено
        Цитата D_KEY @
        Для начала назови общее. А то я не очень понимаю, как мне сравнить шаблон функции с функцией.
        Да элементарно. Я могу вызвать эту функцию, причем с параметрами разных типов. И функция ровно одна. Что там внутри сделает компилятор - детали реализации.

        Добавлено
        Цитата applegame @
        Очень хорошо видно, что T имеет тип Vector!E
        Даже еще проще:
        ExpandedWrap disabled
          void foo(E)(Vector!E vector);
        Разве vector - не полиморфный параметр? Полиморфный, так как вектор может содержать элементы разных типов.

        Добавлено
        Неправильно выразился не T имеет тип, T - это и есть Vector!E
          Цитата applegame @
          И то и другое - деталь реализации.

          Какая деталь реализации? Стандарт C++ требует генерировать новые сущности, C# - не требует. При чём тут реализация?
          Реализация - это способ выполнить требования. Таким образом в C++ нет способа выполнить требование генерации сущностей без генерации оных - значит, не деталь реализации. А в C# есть способ (через динамический полиморфизм) выполнить требования к обобщениям без генерации сущностей - значит, чего мы там генерируем является деталью реализации, не относящейся к сути вопроса.

          Добавлено
          Цитата applegame @
          Да элементарно. Я могу вызвать эту функцию, причем с параметрами разных типов. И функция ровно одна. Что там внутри сделает компилятор - детали реализации.

          Я смотрю, вы так и не поняли, почему мой тогдашний пример с обработкой аргументов variadic template не был рекурсивным.
            Цитата MyNameIsIgor @
            Стандарт C++ требует генерировать новые сущности, C# - не требует.
            И как это противоречит определению параметрического полиморфизма? Типа если в стандарте языка указано как именно компилятор должен реализовать полиморфизм - то это уже и не полиморфизм?
            Цитата MyNameIsIgor @
            Реализация - это способ выполнить требования. Таким образом в C++ нет способа выполнить требование генерации сущностей без генерации оных - значит, не деталь реализации.
            Интересно, а хоть в каком-то определении параметрического полиморфизма есть оговорка, что не должно быть генерации сущностей? Крайне сомневаюсь.

            Добавлено
            Цитата MyNameIsIgor @
            Я смотрю, вы так и не поняли, почему мой тогдашний пример с обработкой аргументов variadic template не был рекурсивным.
            Я его, честно говоря и не видел. Я полез на ЛОР и уже оттуда не вылезал.
            Сообщение отредактировано: applegame -
              В C++ же нельзя запихнуть шаблонную функцию в файл реализации, выставив в хэдер только сигнатуру? А как с этим в D?
              Сообщение отредактировано: korvin -
                Цитата applegame @
                Интересно, а хоть в каком-то определении параметрического полиморфизма есть оговорка, что не должно быть генерации сущностей? Крайне сомневаюсь.

                Поэтому я и говорю
                Цитата MyNameIsIgor @
                позволяет сомневаться

                Но факт есть факт - именно из-за особенностей инстанцирования шаблонов, мы не можем на их основе доказывать те утверждения относительно типов, которые требуют бесконечного инстанцирования.
                  Цитата korvin @
                  В C++ же нельзя запихнуть шаблонную функцию в файл реализации, выставив в хэдер только сигнатуру? А как с этим в D?
                  В этом плане D ничем не отличается от C++. И поэтому в D мы также
                  Цитата MyNameIsIgor @
                  не можем на их основе доказывать те утверждения относительно типов, которые требуют бесконечного инстанцирования.
                  Сообщение отредактировано: applegame -
                    Цитата applegame @
                    ExpandedWrap disabled
                      void foo(T: Vector!E, E)(T vector)

                    Очень хорошо видно, что T имеет тип Vector!E

                    Блин. Vector!E - это конкретный тип, а не полиморфный тип Vector параметризированный E. Не знаю уже, как формулировать.

                    Цитата
                    Цитата D_KEY @
                    Шарп может генерировать, а может не генерировать - это деталь реализации. С++ не может не генерировать.
                    И то и другое - деталь реализации.

                    Нет. C# может не генерировать код для разных инстансов. И быть C#. Конкретная реализация С++ не может отказаться генерировать код для разных инстансов. Этого требует спецификация.

                    Добавлено
                    Цитата applegame @
                    Да элементарно. Я могу вызвать эту функцию

                    Не можешь ты ее вызвать. Потому, что сначала от компилятора требуется сгенерировать некоторую функцию по этому шаблону под твои параметры. А уже потом ты вызовешь эту сгенеренную функцию.

                    Цитата
                    И функция ровно одна.

                    Нет, их будет много. Или ты отрицаешь инстанцирование?
                      Цитата D_KEY @
                      Блин. Vector!E - это конкретный тип, а не полиморфный тип Vector параметризированный E. Не знаю уже, как формулировать.
                      Какой же он конкретный? Это полиморфный тип. Это может быть и Vector!int и Vector!string и даже Vector!(Vector!string). Чем не полиморфность?
                      Цитата D_KEY @
                      Нет. C# может не генерировать код для разных инстансов. И быть C#. Конкретная реализация С++ не может отказаться генерировать код для разных инстансов. Этого требует спецификация.
                      Ну и какая разница? Нигде в определениях параметрического полиморфизма нет требований не "генерировать код для разных инстансов". Почему ты на основании этого утверждаешь, что в C++ полиморфизм не параметрический? Да, с бесконечными инстанцированиями есть проблема, но это, ИМХО, недостаток реализации полиморфизма в C++. И да, этот недостаток заложен в стандарт C++. И что с того?

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

                        Цитата applegame @
                        и будет ли там компилироваться что-то вроде такого:
                        Не будет банально из-за того, что параметрами для дженериков не могут быть значения.
                          Цитата applegame @
                          Это может быть и Vector!int и Vector!string и даже Vector!(Vector!string).

                          Это все будут отдельные конкретные типы. В этом и есть разница. Параметрический полиморфизм на уровне типов вводит эти самые полиморфные типы. А в C++ параметрический полиморфизм на уровне кода(и в D тоже, как я понял), то есть мы описываем некоторый шаблон кода с параметрами, а язык нам обещает генерацию уже конкретного типа на основе этого шаблона.


                          Цитата
                          Цитата D_KEY @
                          Не можешь ты ее вызвать. Потому, что сначала от компилятора требуется сгенерировать некоторую функцию по этому шаблону под твои параметры. А уже потом ты вызовешь эту сгенеренную функцию.
                          Нет я не вызываю никаких сгенеренных функций. Это уже компилятор формирует вызов нужной функции. А я как программист вызываю именно одну функцию.
                          Цитата D_KEY @
                          Нет, их будет много. Или ты отрицаешь инстанцирование?
                          Да мне-то какая разница как там оно будет внутри?

                          Такая, что система типов ничего не знает о твоих шаблонах. Вообще. Она умеет работать только с конкретными типами. А в Haskell том же в системе типов есть понятие полиморфных типов.

                          Добавлено
                          Цитата applegame @
                          И в Хаскеле их внутри будет много и в шарпе.

                          Не будет. Их будет много(возможно) в сгенеренном коде. Но в системе типов будет ровно один тип. И ровно одна функция. Тайпчекер работает с парметрами полиморфного типа практически как с типовыми переменными. В общем, объяснять долго, а толку будет мало :)
                            Цитата applegame @
                            Какой же он конкретный? Это полиморфный тип. Это может быть и Vector!int и Vector!string и даже Vector!(Vector!string). Чем не полиморфность?

                            Тем, что это почти просто текстовая подстановка, почти как макросы (что Сишные, что Лисповые) или HTML-шаблоны, не более того.

                            С тем же успехом можно PHP называть "полиморфным HTML" или как-то так.
                            Сообщение отредактировано: korvin -
                              Цитата korvin @
                              это почти просто текстовая подстановка

                              Ну это тоже неверно. "Подстановка кода" - более точное описание. Да и "шаблон кода", "шаблон типа", "шаблон функции" - подходящие названия.
                                Цитата D_KEY @
                                Ну это тоже неверно. "Подстановка кода" - более точное описание. Да и "шаблон кода", "шаблон типа", "шаблон функции" - подходящие названия.

                                Ну, я не претендовал на абсолютную точность. =)

                                Впрочем, ИМХО, "подстановка кода" тоже не совсем верно, ведь нет никаких средств в compile-time инспектировать этот код, его "кодовость" заключается лишь в том, что его текст(собственно образца) является C++-кодом, а не любым произвольным текстом, как в Сишных макросах.

                                Кстати, не знаю, упоминалось ли тут (в разделе вообще), но в D термин mixin имеет два значения: один обще принятый, а второй --- как раз что-то вроде текстовых подстановок (чуть более продвинутых, чем Сишный препроцессор, но менее продвинутых, чем лисповые макросы).
                                1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
                                0 пользователей:
                                Страницы: (33) « Первая ... 10 11 [12] 13 14 ...  32 33


                                Рейтинг@Mail.ru
                                [ Script execution time: 0,0566 ]   [ 14 queries used ]   [ Generated: 18.05.24, 09:57 GMT ]