
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[216.73.216.218] |
![]() |
|
Страницы: (33) « Первая ... 20 21 [22] 23 24 ... 32 33 ( Перейти к последнему сообщению ) |
Сообщ.
#316
,
|
|
|
Я попробовал сделать без генерации типов, на "трейт-обьектах" (интерфейсах), но снова не получилось, уже изз-а других особенностей языка.
Но вообще как это (в варианте с дженериками) сделать без потери эффективности? |
Сообщ.
#317
,
|
|
|
Цитата applegame @ Да. А в D - законно. Может не будем тогда незаконно менять тип возвращаемый cons и незаконно конструировать списки неверного типа? Если в D это операция законна, то значит все правильно написано, а значит мы все меняем законно. Ведь речь как раз идет о возможностях системы типов. Добавлено Цитата DarkEld3r @ Но вообще как это (в варианте с дженериками) сделать без потери эффективности? Сначала затайпчекать(тут не потребуется инстанцирования, т.к. в Rust нет специализаций и перегрузок), а потом генерировать специализации исключительно с целью оптимизаций. Добавлено Это если вопрос о реализации в языке ![]() |
Сообщ.
#318
,
|
|
|
Цитата D_KEY @ генерировать специализации исключительно с целью оптимизаций Когда остановить то эту генерацию? Или во время исполнения? |
Сообщ.
#319
,
|
|
|
Она есть, но делается неявно компилятором.
Это частный случай. Точнее будет сказать: ListN!N кастуется к List!N - это полиморфные типы. Ну или псевдополиморфные, с твоей точки зрения. А ListN!1 - это уже обычный тип. Просто убрать public? Спасибо. |
Сообщ.
#320
,
|
|
|
Цитата DarkEld3r @ Но вообще как это (в варианте с дженериками) сделать без потери эффективности? Без потери эффективности по сравнению с чем? С учетом того, что просто генерация это сделать не позволяет и даже на C++/D приходится стирать типы. Добавлено Цитата applegame @ Она есть, но делается неявно компилятором. И что? Цитата Это частный случай. Точнее будет сказать: ListN!N кастуется к List!N - это полиморфные типы. Ну или псевдополиморфные, с твоей точки зрения. А ListN!1 - это уже обычный тип. Так ты именно этот обычный тип и передаешь в main_. В первом же внутреннем вызове(и далее). В чем прикол-то? Добавлено Цитата MyNameIsIgor @ Когда остановить то эту генерацию? Тут много вариантов. Можно установить какой-то лимит, который будет означать, что дальнейшая генерация излишняя, стереть типы и все. Цитата Или во время исполнения? Наверное это не лучший вариант. Я не знаю, думаю, что такие вещи надо как следует обдумать ![]() |
Сообщ.
#321
,
|
|
|
Цитата D_KEY @ Скажем в том, что я вообще не манипулирую конкретными типами, только полиморфными вроде List!N. Обычные типы выводятся, кастуются и стираются сами. В первом варианте я стирал вручную. Во втором автоматически. Но автоматику все равно можно сломать если принудительно менять тип.Так ты именно этот обычный тип и передаешь в main_. В первом же внутреннем вызове(и далее). В чем прикол-то? Ну вот, в жабе такая же байда. Ошибся и случайно скастовал к базовому классу (компилятор не возражает). И оно поломалось. Считается? http://ideone.com/N8RiOn Добавлено Цитата applegame @ А базовый ли это класс? Но компилятор все равно не возражает Ошибся и случайно скастовал к базовому классу ![]() |
Сообщ.
#322
,
|
|
|
Цитата applegame @ Ошибся и случайно скастовал к базовому классу ![]() Цитата applegame @ В первом варианте я стирал вручную. Во втором автоматически. Угу. Оно само конструирует именно ListN!1, а не от выведенного числа. Оно само передаёт указатели на наследников туда, где ожидается указатель на Base. И вообще оно само всё написалось. Цитата applegame @ Считается? Ответьте сами. Если считается, то разговор закончен, можете залезать на белого коня - мне никакой выгоды от вашего просвещения. Если не считается, то подумайте, что именно вы доказали на примере Java. |
Сообщ.
#323
,
|
|
|
Цитата applegame @ Ошибся и случайно скастовал к базовому классу (компилятор не возражает). И оно поломалось. Цитата Exception in thread "main" java.lang.ClassCastException: Nil cannot be cast to Cons ![]() |
Сообщ.
#324
,
|
|
|
Цитата D_KEY @ По сравнению с тупой генерацией. В джаве ведь, в итоге, в дженериках оказывался просто Object, так? Это уже менее эффективно, не говоря уже о том, что требует наличия общего родителя для всех типов. Без потери эффективности по сравнению с чем? |
Сообщ.
#325
,
|
|
|
Цитата applegame @ Скажем в том, что я вообще не манипулирую конкретными типами Явно, может и нет. А неявно происходит тоже самое, что сделал я. Не вижу разницы. Цитата Но автоматику все равно можно сломать если принудительно менять тип. Я все делаю в рамках системы типов языка. Более того, я делают тоже самое, что неявно происходит в твоем коде. Добавлено Цитата DarkEld3r @ Цитата D_KEY @ По сравнению с тупой генерацией.Без потери эффективности по сравнению с чем? Тупой генерацией такие задачи не решить. Цитата В джаве ведь, в итоге, в дженериках оказывался просто Object, так? Это уже менее эффективно, не говоря уже о том, что требует наличия общего родителя для всех типов. После того, как уже были проверены типы, на этапе кодогенерации, в тех случаях, когда это выгодно(это где-то рядом с инлайнингом функций), можно генерировать специализации. В Rust их наличие/отсутствие в реализации ничему не мешает. Это если я правильно понимаю. Вполне возможно, что какие-то особенности языка таки заставляют его специализации строить. |
Сообщ.
#326
,
|
|
|
Цитата MyNameIsIgor @ Я уже все сам понял.![]() Цитата MyNameIsIgor @ Честно говоря я жабу не знаю. И мне не ясно почему компилятор позволил кастовать к A. Например к Integer он не дает кастовать. Если не считается, то подумайте, что именно вы доказали на примере Java. Добавлено Цитата D_KEY @ Ну эксепшн то не там где я кастовал а уже при вычислении скалярного произведения. Это и сбивает с толку. ![]() |
Сообщ.
#327
,
|
|
|
То ли лыжи не едут, то ли жабовский код какой-то неполный. Как сгенерить список длинее одного элемента? Вот это не компилируется:
![]() ![]() _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 ЧЯДНТ? |
Сообщ.
#328
,
|
|
|
Цитата applegame @ Честно говоря я жабу не знаю. И мне не ясно почему компилятор позволил кастовать к A. Например к Integer он не дает кастовать. Через (Integer)(Object) даст. Но тогда уже _main не вызовется. Цитата applegame @ Ну эксепшн то не там где я кастовал а уже при вычислении скалярного произведения. Это и сбивает с толку. Это просто говорит о том, что данный явный каст перенёс типизацию в run-time. Это примерно то же, что в плюсах запилить reinterpret_cast, а потом удивляться, что оно упало, но не там, где сам каст. Добавлено Цитата applegame @ ЧЯДНТ? http://ideone.com/Huiqad. Естественно, ошибка несоответствия типов (длин списков). Извиняюсь, слишком бегло посмотрел. Всё верно - http://ideone.com/RlfL3N |
Сообщ.
#329
,
|
|
|
В шарпе таже фигня
![]() |
Сообщ.
#330
,
|
|
|
Цитата applegame @ В шарпе таже фигня Нужно создавать Cons<Cons<A>>. Вы не забыли, что тип показывает длину списка? |