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

        Добавлено
        Вообще говоря, я подозреваю, что вы оба неправильно называете подразумеваемую вами сущность. Шаблонный параметр в данном случае не нуждается в специальных проверках. И вообще, сопоставление по образцу, реализуемое частичной специализацией, решает практически все подобные "концептуальные" проблемы. Вероятно, вы имели в виду параметры шаблонных функций. Это совершенно другой случай. Для шаблонных функций частичная специализация недоступна, вместо неё получается перегрузка. И подобным образом оформленное сопоставление с образцом вызывает иной механизм: разрешение перегрузки вместо выбора специализации. Работающий на иной стадии разбора сырцов к тому же. И решена поднятая проблема может быть только на стадии линковки в лучшем случае.
        Сообщение отредактировано: Qraizer -
          Тут D_KEY приводил ссылку на бессмысленную задачку о compile-time проверки длины векторов с длиной задаваемой в run-time, в которой тролль-хаскелист обвинял C++ в отсутствии полноценного параметрического полиморфизма.
          В той задачке суть свелась, к тому, что некий рекурсивный шаблон разворачивается в C++ в бесконечную рекурсию, так как ограничение этой рекурсии было уже в рантайме, что естественно в плюсах не сработает. Но аналогичный дженерик в Java и C# компилируются успешно.
          D_KEY полагает, что это такое свойство дженериков. Типа вот, чем дженерики отличаются от шаблонов. А по-моему - это просто тонкости реализации. В жабе от бесконечной рекурсии спасает type erasure, в шарпе стирания типов нет, но инстанцирование шаблонов происходит в рантайме. В Хаскеле, по-видимому, все работает из-за повальной ленивости.
          Вопрос, как реализованы дженерики в 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);
            }
          Сообщение отредактировано: applegame -
            applegame, там не задачка бессмысленна, а её постановка. Нельзя в compile-time что-либо сделать с сущностями, чьи свойства определяются в run-time, можно только создать алгоритм этого чего-то. С якобы compile-time алгоритмом его не Плюсовые примеры справляются сугубо из-за подмены понятий. А с определением алгоритма шаблоны справляются куда лучше, чем дженерики, только задачу для них найти надо. Типа шаблонов выражений.
              Цитата Qraizer @
              applegame, там не задачка бессмысленна, а её постановка.
              По мне так, задача с бессмысленной постановкой - бессмыслена.
              Сообщение отредактировано: applegame -
                Цитата Qraizer @
                Нельзя в compile-time что-либо сделать с сущностями, чьи свойства определяются в run-time, можно только создать алгоритм этого чего-то.

                А с ними ничего и не делается. Доказывается утверждение, что у двух векторов/списков будет одна и та же длина. А конкретное значение длины, естественно, неизвестно.

                Добавлено
                Цитата applegame @
                Тут D_KEY приводил ссылку на бессмысленную задачку о compile-time проверки длины векторов с длиной задаваемой в run-time, в которой тролль-хаскелист обвинял C++ в отсутствии полноценного параметрического полиморфизма.

                Все дело в том, что шаблоны генерируют код. Сам код не является параметрически-полиморфным.

                Цитата
                D_KEY полагает, что это такое свойство дженериков. Типа вот, чем дженерики отличаются от шаблонов. А по-моему - это просто тонкости реализации.

                Тут принципиальная разница как раз в том, что в C++(и в D?) у нас нет полиморфных типов/функций, у нас есть механизм генерации конкретных типов и функций в зависимости от параметров.
                И это разница не в реализации.
                  Цитата D_KEY @
                  Доказывается утверждение, что у двух векторов/списков будет одна и та же длина. А конкретное значение длины, естественно, неизвестно.
                  Не доказывается, а создаётся алгоритм доказательства. Тот факт, что C# умеет в run-time делать докомпиляцию, не меняет сути тезиса о том, что понятия подменены.
                  Цитата D_KEY @
                  Все дело в том, что шаблоны генерируют код. Сам код не является параметрически-полиморфным.
                  Забыл добавить "исходный" к "код". Шаблон не существует после компиляции единицы трансляции ...даже не так... после конкретизации в точке инстанцирования. Всё, в этой точке его больше нет. Вот в чём отличие шарповых дженериков. Шаблоны ровно такими свойствами и наделялись, чтобы не быть адовыми дженериками. Обвинять шаблоны в невлиянии на run-time всё равно, что Джаву в наличии виртуальной машины. Или std::vector<> в копировании свойств C-массива. Шаблонный код является абсолютно полным параметрически-полиморфным, если применять те же термины к тем же фазам жизненных циклов. Автор шаблонного кода наделяет его полиморфным поведением, которое доопределяется в точке использования. Всем бобра.
                    Цитата D_KEY @
                    Все дело в том, что шаблоны генерируют код. Сам код не является параметрически-полиморфным.
                    Цитата D_KEY @
                    Тут принципиальная разница как раз в том, что в C++(и в D?) у нас нет полиморфных типов/функций, у нас есть механизм генерации конкретных типов и функций в зависимости от параметров.
                    И это разница не в реализации.

                    Не согласен. На самом деле парметрический полиморфизм существует только в головах программистов и в текстовом редакторе с искходником функции.
                    А по сути любой параметрический полиморфизм конвертируется в итоге в ad-hoc полиморфизм. Не думаешь же ты, что для работы, например c int и float применяется один и тот же машкод? Будь-то хваленный Хаскель или Java. Просто в C++ это явно прописано, а в всяких хаскелях спрятано под капотом.

                    Добавлено
                    Цитата Qraizer @
                    Шаблонный код является абсолютно полным параметрически-полиморфным, если применять те же термины к тем же фазам жизненных циклов. Автор шаблонного кода наделяет его полиморфным поведением, которое доопределяется в точке использования. Всем бобра.
                    Полностью согласен!
                      Цитата Qraizer @
                      Не доказывается, а создаётся алгоритм доказательства. Тот факт, что C# умеет в run-time делать докомпиляцию, не меняет сути тезиса о том, что понятия подменены.

                      Я тут даже не знаю какой смайлик подобрать этой цитате: :lool: :facepalm: :fool:. Или все сразу? D_KEY, как думаешь?
                      Цитата Qraizer @
                      Забыл добавить "исходный" к "код". Шаблон не существует после компиляции единицы трансляции ...даже не так... после конкретизации в точке инстанцирования. Всё, в этой точке его больше нет. Вот в чём отличие шарповых дженериков.

                      Именно, вот в чём отличие обобщений - они не генерируют новые сущности. Шаблоны генерируют. Этот факт и позволяет сомневаться в том, что они являются реализацией параметрического полиморфизма.
                      Цитата applegame @
                      Не согласен. На самом деле парметрический полиморфизм существует только в головах программистов и в текстовом редакторе с искходником функции.

                      Т.е. там же, где и типы данных. А между тем Agda статически доказывает, что в программе нет деления на ноль, а в мейнстриме всё ещё неопределённое поведение и null reference exception. Так может быть среда существования чего-то ничего не говорит об этом чём-то?
                      Цитата applegame @
                      А по сути любой параметрический полиморфизм конвертируется в итоге в ad-hoc полиморфизм. Не думаешь же ты, что для работы, например c int и float применяется один и тот же машкод?

                      Как он там в реализации - абсолютно не важно. Потому что пример нагружает систему типов.
                      А так в C# обобщения реализованы вполне себе через динамический полиморфизм. И только если CLR захочет, может с'jit'ить специальный.

                      Добавлено
                      Цитата D_KEY @
                      Тут принципиальная разница как раз в том, что в C++(и в D?) у нас нет полиморфных типов/функций, у нас есть механизм генерации конкретных типов и функций в зависимости от параметров.

                      Дело осталось за малым: доказать, что лучше иметь правильный параметрический полиморфизм, чем генерацию сущностей.
                      Сообщение отредактировано: MyNameIsIgor -
                        Цитата Qraizer @
                        Не доказывается, а создаётся алгоритм доказательства.

                        Смысл в том, что система типов поможет нам гарантировать, что длина будет одной и той же. Называй как хочешь.

                        Цитата
                        Тот факт, что C# умеет в run-time делать докомпиляцию, не меняет сути тезиса о том, что понятия подменены.

                        Эм. При чем тут какая-то докомпиляция?

                        Цитата
                        Забыл добавить "исходный" к "код". Шаблон не существует после компиляции единицы трансляции ...даже не так... после конкретизации в точке инстанцирования. Всё, в этой точке его больше нет. Вот в чём отличие шарповых дженериков.

                        Именно. Именно то, что шаблонный тип/функция являются сущностями времени компиляции, предназначенными для генерации "настоящих" типов и "настоящих" функций, которые уже неполиморфны.

                        Цитата
                        Шаблонный код является абсолютно полным параметрически-полиморфным, если применять те же термины к тем же фазам жизненных циклов.

                        Шаблонный код не полиморфен уже на уровне системы типов. Вот в чем проблема(для данного примера).

                        Добавлено
                        Цитата applegame @
                        Не согласен. На самом деле парметрический полиморфизм существует только в головах программистов и в текстовом редакторе с искходником функции.

                        Он существует в системе типов. Или не существует(как в С++).

                        Цитата
                        Не думаешь же ты, что для работы, например c int и float применяется один и тот же машкод? Будь-то хваленный Хаскель или Java. Просто в C++ это явно прописано, а в всяких хаскелях спрятано под капотом.

                        Вот у них как раз это дело реализации, а в C++ это делается в самом языке.

                        Добавлено
                        Цитата MyNameIsIgor @
                        Цитата D_KEY @
                        Тут принципиальная разница как раз в том, что в C++(и в D?) у нас нет полиморфных типов/функций, у нас есть механизм генерации конкретных типов и функций в зависимости от параметров.

                        Дело осталось за малым: доказать, что лучше иметь правильный параметрический полиморфизм, чем генерацию сущностей.

                        Не думаю, что это можно доказать. Это вопрос цены и достоинств того или другого подхода. В идеале хотелось бы иметь выбор, но его сложно представить себе в рамках одного языка.
                          Цитата D_KEY @
                          Не думаю, что это можно доказать. Это вопрос цены и достоинств того или другого подхода.

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

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

                            Даже более того, процедуры, циклы, типы тоже существуют только в головах программистов и в текстовом редакторе с исходником программы! All Hail Machine code!
                              Цитата D_KEY @
                              Шаблонный код не полиморфен уже на уровне системы типов.
                              Я не понимаю, что значит не полиморфен на уровне системы типов? Вот тебе код:
                              ExpandedWrap disabled
                                template<typename T> foo(T param)
                              Ты хочешь сказать, что T - это не плиморфный тип?
                              Цитата D_KEY @
                              Вот у них как раз это дело реализации, а в C++ это делается в самом языке.
                              Нет, не делается. На языке C++ код вполне себе один, а то что компилятор нагенерит для каждого типа свои функции - это как раз детали реализации.
                              Цитата D_KEY @
                              Эм. При чем тут какая-то докомпиляция?
                              Потому что шарп тоже генерит для каждого типа свой код как и плюсы. Только шарп это делает run-time, а плюсы compile-time.
                              Цитата MyNameIsIgor @
                              Так вот Rust же. Ну, или я чего-то не знаю, но в любом случае они очень близко подошли.
                              И в 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);
                                }
                                Цитата applegame @
                                Я не понимаю, что значит не полиморфен на уровне системы типов? Вот тебе код:
                                ExpandedWrap disabled
                                  template<typename T> foo(T param)
                                Ты хочешь сказать, что T - это не плиморфный тип?

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


                                Рейтинг@Mail.ru
                                [ Script execution time: 0,0520 ]   [ 14 queries used ]   [ Generated: 29.05.24, 04:49 GMT ]