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

    Но вообще как это (в варианте с дженериками) сделать без потери эффективности?
      Цитата applegame @
      Цитата MyNameIsIgor @
      Нет, просто потому, что это преобразование незаконно.
      Да. А в D - законно. Может не будем тогда незаконно менять тип возвращаемый cons и незаконно конструировать списки неверного типа?

      Если в D это операция законна, то значит все правильно написано, а значит мы все меняем законно. Ведь речь как раз идет о возможностях системы типов.

      Добавлено
      Цитата DarkEld3r @
      Но вообще как это (в варианте с дженериками) сделать без потери эффективности?

      Сначала затайпчекать(тут не потребуется инстанцирования, т.к. в Rust нет специализаций и перегрузок), а потом генерировать специализации исключительно с целью оптимизаций.

      Добавлено
      Это если вопрос о реализации в языке :)
        Цитата D_KEY @
        генерировать специализации исключительно с целью оптимизаций

        Когда остановить то эту генерацию? Или во время исполнения?
          Цитата D_KEY @
          При вызове cons вызывается не первая перегрузка?
          Она есть, но делается неявно компилятором.
          Цитата D_KEY @
          А разве при передачи в main_ ListN!1 не кастуется к List!1?
          Это частный случай. Точнее будет сказать: ListN!N кастуется к List!N - это полиморфные типы. Ну или псевдополиморфные, с твоей точки зрения. А ListN!1 - это уже обычный тип.
          Цитата MyNameIsIgor @
          Компилятор же говорит, что надо сделать - http://ideone.com/iglyDq
          Просто убрать public? Спасибо.
            Цитата DarkEld3r @
            Но вообще как это (в варианте с дженериками) сделать без потери эффективности?

            Без потери эффективности по сравнению с чем? С учетом того, что просто генерация это сделать не позволяет и даже на C++/D приходится стирать типы.

            Добавлено
            Цитата applegame @
            Цитата D_KEY @
            При вызове cons вызывается не первая перегрузка?
            Она есть, но делается неявно компилятором.

            И что?

            Цитата
            Цитата D_KEY @
            А разве при передачи в main_ ListN!1 не кастуется к List!1?
            Это частный случай. Точнее будет сказать: ListN!N кастуется к List!N - это полиморфные типы. Ну или псевдополиморфные, с твоей точки зрения. А ListN!1 - это уже обычный тип.

            Так ты именно этот обычный тип и передаешь в main_. В первом же внутреннем вызове(и далее). В чем прикол-то?

            Добавлено
            Цитата MyNameIsIgor @
            Когда остановить то эту генерацию?

            Тут много вариантов. Можно установить какой-то лимит, который будет означать, что дальнейшая генерация излишняя, стереть типы и все.

            Цитата
            Или во время исполнения?

            Наверное это не лучший вариант.

            Я не знаю, думаю, что такие вещи надо как следует обдумать :)
              Цитата D_KEY @
              Так ты именно этот обычный тип и передаешь в main_. В первом же внутреннем вызове(и далее). В чем прикол-то?
              Скажем в том, что я вообще не манипулирую конкретными типами, только полиморфными вроде List!N. Обычные типы выводятся, кастуются и стираются сами. В первом варианте я стирал вручную. Во втором автоматически. Но автоматику все равно можно сломать если принудительно менять тип.

              Ну вот, в жабе такая же байда. Ошибся и случайно скастовал к базовому классу (компилятор не возражает). И оно поломалось. Считается?
              http://ideone.com/N8RiOn

              Добавлено
              Цитата applegame @
              Ошибся и случайно скастовал к базовому классу
              А базовый ли это класс? Но компилятор все равно не возражает :)
              Сообщение отредактировано: applegame -
                Цитата applegame @
                Ошибся и случайно скастовал к базовому классу

                :facepalm: Ни к какому базовому классу вы ничего не кастовали.
                Цитата applegame @
                В первом варианте я стирал вручную. Во втором автоматически.

                Угу. Оно само конструирует именно ListN!1, а не от выведенного числа. Оно само передаёт указатели на наследников туда, где ожидается указатель на Base. И вообще оно само всё написалось.
                Цитата applegame @
                Считается?

                Ответьте сами. Если считается, то разговор закончен, можете залезать на белого коня - мне никакой выгоды от вашего просвещения.
                Если не считается, то подумайте, что именно вы доказали на примере Java.
                Сообщение отредактировано: MyNameIsIgor -
                  Цитата applegame @
                  Ошибся и случайно скастовал к базовому классу (компилятор не возражает). И оно поломалось.

                  Цитата
                  Exception in thread "main" java.lang.ClassCastException: Nil cannot be cast to Cons

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

                      Явно, может и нет. А неявно происходит тоже самое, что сделал я. Не вижу разницы.

                      Цитата
                      Но автоматику все равно можно сломать если принудительно менять тип.

                      Я все делаю в рамках системы типов языка. Более того, я делают тоже самое, что неявно происходит в твоем коде.

                      Добавлено
                      Цитата DarkEld3r @
                      Цитата D_KEY @
                      Без потери эффективности по сравнению с чем?
                      По сравнению с тупой генерацией.

                      Тупой генерацией такие задачи не решить.

                      Цитата
                      В джаве ведь, в итоге, в дженериках оказывался просто Object, так? Это уже менее эффективно, не говоря уже о том, что требует наличия общего родителя для всех типов.

                      После того, как уже были проверены типы, на этапе кодогенерации, в тех случаях, когда это выгодно(это где-то рядом с инлайнингом функций), можно генерировать специализации. В Rust их наличие/отсутствие в реализации ничему не мешает. Это если я правильно понимаю. Вполне возможно, что какие-то особенности языка таки заставляют его специализации строить.
                        Цитата MyNameIsIgor @
                        :facepalm: Ни к какому базовому классу вы ничего не кастовали.
                        Я уже все сам понял.
                        Цитата MyNameIsIgor @
                        Если не считается, то подумайте, что именно вы доказали на примере Java.
                        Честно говоря я жабу не знаю. И мне не ясно почему компилятор позволил кастовать к A. Например к Integer он не дает кастовать.

                        Добавлено
                        Цитата D_KEY @
                        :-?
                        Ну эксепшн то не там где я кастовал а уже при вычислении скалярного произведения. Это и сбивает с толку.
                          То ли лыжи не едут, то ли жабовский код какой-то неполный. Как сгенерить список длинее одного элемента? Вот это не компилируется:
                          ExpandedWrap disabled
                            _main(n-1, i+1, new Cons<A>(i, new Cons<A>(2*i+1,first)), new Cons<A>(i, new Cons<A>(i*i, second)));

                          http://ideone.com/RSGkSv
                          ЧЯДНТ?
                          Сообщение отредактировано: applegame -
                            Цитата applegame @
                            Честно говоря я жабу не знаю. И мне не ясно почему компилятор позволил кастовать к A. Например к Integer он не дает кастовать.

                            Через (Integer)(Object) даст. Но тогда уже _main не вызовется.
                            Цитата applegame @
                            Ну эксепшн то не там где я кастовал а уже при вычислении скалярного произведения. Это и сбивает с толку.

                            Это просто говорит о том, что данный явный каст перенёс типизацию в run-time. Это примерно то же, что в плюсах запилить reinterpret_cast, а потом удивляться, что оно упало, но не там, где сам каст.

                            Добавлено
                            Цитата applegame @
                            ЧЯДНТ?

                            http://ideone.com/Huiqad. Естественно, ошибка несоответствия типов (длин списков).


                            Извиняюсь, слишком бегло посмотрел. Всё верно - http://ideone.com/RlfL3N
                            Сообщение отредактировано: MyNameIsIgor -
                              В шарпе таже фигня :( http://ideone.com/LLsWQN
                                Цитата applegame @
                                В шарпе таже фигня

                                Нужно создавать Cons<Cons<A>>. Вы не забыли, что тип показывает длину списка?
                                0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                0 пользователей:
                                Страницы: (33) « Первая ... 20 21 [22] 23 24 ...  32 33


                                Рейтинг@Mail.ru
                                [ Script execution time: 0,0614 ]   [ 15 queries used ]   [ Generated: 20.07.25, 14:14 GMT ]