Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.147.67.48] |
|
Страницы: (33) « Первая ... 10 11 [12] 13 14 ... 32 33 ( Перейти к последнему сообщению ) |
Сообщ.
#166
,
|
|
|
Цитата D_KEY @ Ну и назови мне хоть одно отличие от "настоящей" функции. Эм... Конечно не полиморфный. А foo - неполиморфная функция, потому, что это вообще не функция. |
Сообщ.
#167
,
|
|
|
Код может и один. Но std::vector<> - не является типом, а java.util.Vector<> - является. Добавлено Шарп может генерировать, а может не генерировать - это деталь реализации. С++ не может не генерировать. Цитата И в Rust такая вот фигня скомпилится? 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 - неполиморфная функция, потому, что это вообще не функция. Для начала назови общее. А то я не очень понимаю, как мне сравнить шаблон функции с функцией. |
Сообщ.
#168
,
|
|
|
Цитата D_KEY @ Опять же не согласен. Конечно обычные переменные в C++ не могут иметь "тип" std::vector<>, а вот полиморфные в шаблонах могут. Особенно это заметно в D:Код может и один. Но std::vector<> - не является типом, а java.util.Vector<> - является. void foo(T: Vector!E, E)(T vector) Очень хорошо видно, что T имеет тип Vector!E Цитата D_KEY @ И то и другое - деталь реализации. Со своими недостатками и преимуществами. Шарп может генерировать, а может не генерировать - это деталь реализации. С++ не может не генерировать. Добавлено Цитата D_KEY @ Да элементарно. Я могу вызвать эту функцию, причем с параметрами разных типов. И функция ровно одна. Что там внутри сделает компилятор - детали реализации. Для начала назови общее. А то я не очень понимаю, как мне сравнить шаблон функции с функцией. Добавлено Цитата applegame @ Даже еще проще:Очень хорошо видно, что T имеет тип Vector!E void foo(E)(Vector!E vector); Добавлено Неправильно выразился не T имеет тип, T - это и есть Vector!E |
Сообщ.
#169
,
|
|
|
Цитата applegame @ И то и другое - деталь реализации. Какая деталь реализации? Стандарт C++ требует генерировать новые сущности, C# - не требует. При чём тут реализация? Реализация - это способ выполнить требования. Таким образом в C++ нет способа выполнить требование генерации сущностей без генерации оных - значит, не деталь реализации. А в C# есть способ (через динамический полиморфизм) выполнить требования к обобщениям без генерации сущностей - значит, чего мы там генерируем является деталью реализации, не относящейся к сути вопроса. Добавлено Цитата applegame @ Да элементарно. Я могу вызвать эту функцию, причем с параметрами разных типов. И функция ровно одна. Что там внутри сделает компилятор - детали реализации. Я смотрю, вы так и не поняли, почему мой тогдашний пример с обработкой аргументов variadic template не был рекурсивным. |
Сообщ.
#170
,
|
|
|
Цитата MyNameIsIgor @ И как это противоречит определению параметрического полиморфизма? Типа если в стандарте языка указано как именно компилятор должен реализовать полиморфизм - то это уже и не полиморфизм?Стандарт C++ требует генерировать новые сущности, C# - не требует. Цитата MyNameIsIgor @ Интересно, а хоть в каком-то определении параметрического полиморфизма есть оговорка, что не должно быть генерации сущностей? Крайне сомневаюсь. Реализация - это способ выполнить требования. Таким образом в C++ нет способа выполнить требование генерации сущностей без генерации оных - значит, не деталь реализации. Добавлено Цитата MyNameIsIgor @ Я его, честно говоря и не видел. Я полез на ЛОР и уже оттуда не вылезал. Я смотрю, вы так и не поняли, почему мой тогдашний пример с обработкой аргументов variadic template не был рекурсивным. |
Сообщ.
#171
,
|
|
|
В C++ же нельзя запихнуть шаблонную функцию в файл реализации, выставив в хэдер только сигнатуру? А как с этим в D?
|
Сообщ.
#172
,
|
|
|
Цитата applegame @ Интересно, а хоть в каком-то определении параметрического полиморфизма есть оговорка, что не должно быть генерации сущностей? Крайне сомневаюсь. Поэтому я и говорю Но факт есть факт - именно из-за особенностей инстанцирования шаблонов, мы не можем на их основе доказывать те утверждения относительно типов, которые требуют бесконечного инстанцирования. |
Сообщ.
#173
,
|
|
|
Цитата korvin @ В этом плане D ничем не отличается от C++. И поэтому в D мы такжеВ C++ же нельзя запихнуть шаблонную функцию в файл реализации, выставив в хэдер только сигнатуру? А как с этим в D? Цитата MyNameIsIgor @ не можем на их основе доказывать те утверждения относительно типов, которые требуют бесконечного инстанцирования. |
Сообщ.
#174
,
|
|
|
Цитата applegame @ void foo(T: Vector!E, E)(T vector) Очень хорошо видно, что T имеет тип Vector!E Блин. Vector!E - это конкретный тип, а не полиморфный тип Vector параметризированный E. Не знаю уже, как формулировать. Цитата Цитата D_KEY @ И то и другое - деталь реализации.Шарп может генерировать, а может не генерировать - это деталь реализации. С++ не может не генерировать. Нет. C# может не генерировать код для разных инстансов. И быть C#. Конкретная реализация С++ не может отказаться генерировать код для разных инстансов. Этого требует спецификация. Добавлено Цитата applegame @ Да элементарно. Я могу вызвать эту функцию Не можешь ты ее вызвать. Потому, что сначала от компилятора требуется сгенерировать некоторую функцию по этому шаблону под твои параметры. А уже потом ты вызовешь эту сгенеренную функцию. Цитата И функция ровно одна. Нет, их будет много. Или ты отрицаешь инстанцирование? |
Сообщ.
#175
,
|
|
|
Цитата D_KEY @ Какой же он конкретный? Это полиморфный тип. Это может быть и Vector!int и Vector!string и даже Vector!(Vector!string). Чем не полиморфность?Блин. Vector!E - это конкретный тип, а не полиморфный тип Vector параметризированный E. Не знаю уже, как формулировать. Цитата D_KEY @ Ну и какая разница? Нигде в определениях параметрического полиморфизма нет требований не "генерировать код для разных инстансов". Почему ты на основании этого утверждаешь, что в C++ полиморфизм не параметрический? Да, с бесконечными инстанцированиями есть проблема, но это, ИМХО, недостаток реализации полиморфизма в C++. И да, этот недостаток заложен в стандарт C++. И что с того? Нет. C# может не генерировать код для разных инстансов. И быть C#. Конкретная реализация С++ не может отказаться генерировать код для разных инстансов. Этого требует спецификация. Добавлено Цитата D_KEY @ Нет я не вызываю никаких сгенеренных функций. Это уже компилятор формирует вызов нужной функции. А я как программист вызываю именно одну функцию.Не можешь ты ее вызвать. Потому, что сначала от компилятора требуется сгенерировать некоторую функцию по этому шаблону под твои параметры. А уже потом ты вызовешь эту сгенеренную функцию. Цитата D_KEY @ Да мне-то какая разница как там оно будет внутри? И в Хаскеле их внутри будет много и в шарпе. Кому какое дело до того, что там будет внутри? У меня в коде одна функция? - одна. Что еще нужно-то? Нет, их будет много. Или ты отрицаешь инстанцирование? |
Сообщ.
#176
,
|
|
|
Нет, но по моему, тема себя исчерпала - эта "задача" (если не расширять её до концептов) не сильно востребована на практике.
Не будет банально из-за того, что параметрами для дженериков не могут быть значения. |
Сообщ.
#177
,
|
|
|
Цитата applegame @ Это может быть и Vector!int и Vector!string и даже Vector!(Vector!string). Это все будут отдельные конкретные типы. В этом и есть разница. Параметрический полиморфизм на уровне типов вводит эти самые полиморфные типы. А в C++ параметрический полиморфизм на уровне кода(и в D тоже, как я понял), то есть мы описываем некоторый шаблон кода с параметрами, а язык нам обещает генерацию уже конкретного типа на основе этого шаблона. Цитата Цитата D_KEY @ Нет я не вызываю никаких сгенеренных функций. Это уже компилятор формирует вызов нужной функции. А я как программист вызываю именно одну функцию.Не можешь ты ее вызвать. Потому, что сначала от компилятора требуется сгенерировать некоторую функцию по этому шаблону под твои параметры. А уже потом ты вызовешь эту сгенеренную функцию. Цитата D_KEY @ Да мне-то какая разница как там оно будет внутри?Нет, их будет много. Или ты отрицаешь инстанцирование? Такая, что система типов ничего не знает о твоих шаблонах. Вообще. Она умеет работать только с конкретными типами. А в Haskell том же в системе типов есть понятие полиморфных типов. Добавлено Цитата applegame @ И в Хаскеле их внутри будет много и в шарпе. Не будет. Их будет много(возможно) в сгенеренном коде. Но в системе типов будет ровно один тип. И ровно одна функция. Тайпчекер работает с парметрами полиморфного типа практически как с типовыми переменными. В общем, объяснять долго, а толку будет мало |
Сообщ.
#178
,
|
|
|
Цитата applegame @ Какой же он конкретный? Это полиморфный тип. Это может быть и Vector!int и Vector!string и даже Vector!(Vector!string). Чем не полиморфность? Тем, что это почти просто текстовая подстановка, почти как макросы (что Сишные, что Лисповые) или HTML-шаблоны, не более того. С тем же успехом можно PHP называть "полиморфным HTML" или как-то так. |
Сообщ.
#179
,
|
|
|
Цитата korvin @ это почти просто текстовая подстановка Ну это тоже неверно. "Подстановка кода" - более точное описание. Да и "шаблон кода", "шаблон типа", "шаблон функции" - подходящие названия. |
Сообщ.
#180
,
|
|
|
Цитата D_KEY @ Ну это тоже неверно. "Подстановка кода" - более точное описание. Да и "шаблон кода", "шаблон типа", "шаблон функции" - подходящие названия. Ну, я не претендовал на абсолютную точность. =) Впрочем, ИМХО, "подстановка кода" тоже не совсем верно, ведь нет никаких средств в compile-time инспектировать этот код, его "кодовость" заключается лишь в том, что его текст(собственно образца) является C++-кодом, а не любым произвольным текстом, как в Сишных макросах. Кстати, не знаю, упоминалось ли тут (в разделе вообще), но в D термин mixin имеет два значения: один обще принятый, а второй --- как раз что-то вроде текстовых подстановок (чуть более продвинутых, чем Сишный препроцессор, но менее продвинутых, чем лисповые макросы). |