
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[216.73.216.218] |
![]() |
|
Страницы: (33) « Первая ... 17 18 [19] 20 21 ... 32 33 ( Перейти к последнему сообщению ) |
![]() |
Сообщ.
#271
,
|
|
Цитата MyNameIsIgor @ Нет, не один. Ещё раз: Стандарт требует генерироваться специализации. Потому если программист не написал пользовательскую специализацию, то компилятор сгенерирует свою. ![]() |
Сообщ.
#272
,
|
|
|
Цитата Qraizer @ Да, я уже понял это. Именно так и обстоят дела. ![]() |
Сообщ.
#273
,
|
|
|
Цитата applegame @ Я могу с тем же успехом заменить в Хаскельном исходнике n - 1 на n + 1 и оно уйдет в переполнение стека. Нет? Да. Из этого будет однозначный вывод: хаскель не может детектировать переполнение стека при компиляции (или может, но программист это не сделал - но это другая история). Но поставленную задачу - статически гарантировать обработку списком одинакового размера - он выполнил. А в C++, D и т.п. мы не гарантировали ничего: ни списков, ни стека ![]() |
Сообщ.
#274
,
|
|
|
Цитата MyNameIsIgor @ Я не согласен и покажу это завтра. Вы зафейлили генерацию списков, но ее можно переписать так, что уже не зафейлишь. Ибо само заполнение к задаче имеет отношение, чуть менее, чем никакое. Да. Из этого будет однозначный вывод: хаскель не может детектировать переполнение стека при компиляции (или может, но программист это не сделал - но это другая история). Но поставленную задачу - статически гарантировать обработку списком одинакового размера - он выполнил. А в C++, D и т.п. мы не гарантировали ничего: ни списков, ни стека ![]() |
Сообщ.
#275
,
|
|
|
Цитата applegame @ Ибо само заполнение к задаче имеет отношение, чуть менее, чем никакое. С чего бы? ![]() |
![]() |
Сообщ.
#276
,
|
|
Цитата applegame @ applegame, задача простая даже для C++03. Подсказать? но ее можно переписать так, что уже не зафейлишь. |
Сообщ.
#277
,
|
|
|
Цитата Qraizer @ Я наконец-то понял, в чём косяк,applegame! Эти кадры называют специализацией любую конкретизацию! Ононокак. Ты их не переубедишь. Я даже не буду спрашивать из какого носа выковыряли термин "конкретизация", а просто скажу: кадры из Комитета тоже считают, что инстанцирование шаблона приводит к его неявной специализации, если он не был специализирован явно. Так и пишут, сволочи такие Цитата ISO/IEC 14882, 14.7/4 An instantiated template specialization can be either implicitly instantiated (14.7.1) for a given argument list or be explicitly instantiated (14.7.2). A specialization is a class, function, or class member that is either instantiated or explicitly specialized (14.7.3). Цитата ISO/IEC 14882, 14.7.1/1 Unless a class template specialization has been explicitly instantiated (14.7.2) or explicitly specialized (14.7.3), the class template specialization is implicitly instantiated when the specialization is referenced in a context that requires a completely-defined object type or when the completeness of the class type affects the semantics of the program. Цитата ISO/IEC 14882, 14.7.1/3 Unless a function template specialization has been explicitly instantiated or explicitly specialized, the function template specialization is implicitly instantiated when the specialization is referenced in a context that requires a function definition to exist. Ну, и далее по тексту. А теперь обращение к нормальным людям: да пусть даже инстанцирование не приводит к появлению специализаций, но чем сгенерированные при инстанцировании типы/функции отличаются от явных специализаций, который есть ad-hoc полиморфизм? Цитата Qraizer @ В общем, кому ехать, а кому-то шашечки. Мы тут пытаемся ехать. Кто-то нам даже обещал, что ехать получится на "азах метакодирования", но всё закончилось балабольством. |
![]() |
Сообщ.
#278
,
|
|
Ты не открыл Америку, MyNameIsIgor. Некто, то ли Вандевурд, то ли Джосаттис, запамятовал, кто из них из EDG, которая единственная в мире реализовала экспорт шаблонов, а может и оба, английским по белому возмущались непродуманностью терминологии в Стандарте, что может запутать, если не читать его очень вдумчиво. Вот прям как ты возмущались. Моя терминология, кстати, от них. Можешь их тоже причислить к ненормальным. Впрочем, есть другой вариант: почитать Стандарт вдумчиво. Просто намекну.
Цитата MyNameIsIgor @ Ответ есть в Стандарте. Они качественные, с кучей следствий из этого. но чем сгенерированные при инстанцировании типы/функции отличаются от явных специализаций, который есть ad-hoc полиморфизм? А своё эго можешь потешить, сказав какое-нибудь слово последним. Я не буду ничего доказывать, ни одним из четырёх способов, три из которых доступны ещё с C++03, если не ещё раньше. Ибо возвращаю: Цитата MyNameIsIgor @ За сим откланиваюсь. Возможно есть, возможно - нет. В любом случае я хочу, чтобы слушающий обладал достаточным интеллектом, чтобы понять сказанное. Добавлено P.S. Четыре – не предел. |
Сообщ.
#279
,
|
|
|
Цитата Qraizer @ Четыре – не предел. Вы ещё поглубже затянитесь - там и пятый с шестым подоспеют. |
Сообщ.
#280
,
|
|
|
Qraizer, не очень понимаю, в чем смысл твоих последних постов? "Я все знаю, я все умею, а вы кадры, я вам ничего не скажу, я вам ничего не покажу, хотя знаю 42 способа". Мог бы вообще ничего не писать
![]() Добавлено Цитата Qraizer @ Не используй специализацию и/или перегрузку. Поверь на слово, это возможно. Скажу даже больше: оказывается, вполне реально не использовать квалификацию у виртуальных методов. Да-да, ей богу не вру. И это как-то заставит компилятор не генерировать типы и функции? Цитата D_KEY, может хватит валенком прикидываться, а? Может хватит строить из себя неизвестно кого и переходить на личности? Не пора ли начать аргументировать свою позицию? Например, цитатами из стандарта. Цитата Давай я открою ещё одну страшную тайну. Когда ты используешь шаблон, тебе не надо ничего этого знать. Оно само работает. Если вдруг понадобилось, значит с вероятностью 86% у тебя хреновый код или с вероятностью 14% хреновый код у автора шаблона. Мы говорили о написании шаблона, а не использовании его. |
![]() |
Сообщ.
#281
,
|
|
Почему я должен был бы это делать, а вы, D_KEY, нет? Вам дали определение. Вы его проигнорировали, упёршись в реализацию. Это был аргумент, что ли? Ну так динамический полиморфизм тоже реализован посредством таблицы указателей, которая к слову может быть реализована на C, и именно так и реализуется, если кому надо, значит C++ не поддерживает динамический полиморфизм? Как это опровергать, кроме как отослать к учебникам? Ты красиво воспользовались возможностью Плюсов выключить полиморфизм, в результате чего подытожил, что эта возможность означает отсутствие поддержки полиморфизма. Я честно попытался указать тебе ошибочность такой точки зрения. И что? В качестве методички по основам затронутого материала можно ознакомиться с популярным изложением матчасти, которая лежала всё это время перед вашими глазами. Потом можно будет перейти к серьёзной литературе. Можете ваше виденье критериев соответствия оставить при себе для Никонова с Мастеровым.
Что касается личностей, так это его слова были. Если он так крут, чтобы наезжать на DarkEld3r, пусть сначала сам за себя ответит. И да, я не буду сюда постить цитаты из Стандарта. Отличия размазаны по всей главе, посвящённой шаблонам, а она большая. P.S. Один из 4-ёх вариантов могу обрисовать прям счас без всякого кода. Он настолько элементарен, что о нём легко забыть. А именно: ... ничего для контроля длины не писать. Внезапно, да? При разной длине списков код гарантировано не скомпилится. Требование выполнено. Добавлено P.P.S. В последний раз. Шаблоны полностью отвечают затронутому вопросу. Метакод прекрасно описывается алгеброй типизированного лямбда-исчисления. Ограничения шаблонов на возможность работы только с константными сущностями, будь то значения или типы, накладывают определённые ограничения на сферу их применимости. С этим спорить некто не собирался. Метакод не может менять сущности, но может создавать новые на основе существующих. Значения-типы в частности. Так что спорить с тем, что шаблоны реализуют параметрический полиморфизм, это то же, что утверждать, мол, фронт-энд компилятор с C++ в C – это не компилятор C++. Тогда и gcc не компилятор. И clang тоже. Удачи с бобами. |
Сообщ.
#282
,
|
|
|
Цитата Qraizer @ Почему я должен был бы это делать, а вы, D_KEY, нет? Вам дали определение. Из определения ПП следует отсутствие зависимости кода(исходного, а не бинарного) от параметров. В C++ эта зависимость существует(в haskell, java, c# - нет). Отсюда и требование обязательной специализации, которое и мешает решить задачу. Дженерики и полиморфные типы обеспечивают типобезопасность без специализации всего и вся(т.к. они не обеспечивают специальный полиморфизм, который обеспечивают шаблоны). Добавлено Цитата Qraizer @ Вы его проигнорировали, упёршись в реализацию. В том и дело, что для C++ это вопрос не реализации, а спецификации языка. Вот в случае полиморфных типов или дженериков(хотя Rust, да) это вопрос реализации, будет она в отдельных случаях что-то специализировать или нет. Добавлено Цитата Qraizer @ Ну так динамический полиморфизм тоже реализован посредством таблицы указателей, которая к слову может быть реализована на C, и именно так и реализуется, если кому надо, значит C++ не поддерживает динамический полиморфизм? Нет, не означает. Цитата Ты красиво воспользовались возможностью Плюсов выключить полиморфизм, в результате чего подытожил, что эта возможность означает отсутствие поддержки полиморфизма. Я тебе уже говорил. Полиморфизм есть. Но это не параметрический полиморфизм, а специальный. Цитата Я честно попытался указать тебе ошибочность такой точки зрения. И что? В качестве методички по основам затронутого материала можно ознакомиться с популярным изложением матчасти, которая лежала всё это время перед вашими глазами. Потом можно будет перейти к серьёзной литературе. Могу дать тот же совет тебе ![]() Цитата Метакод прекрасно описывается алгеброй типизированного лямбда-исчисления. Допустим. Цитата Ограничения шаблонов на возможность работы только с константными сущностями, будь то значения или типы, накладывают определённые ограничения на сферу их применимости. Да. Цитата Метакод не может менять сущности, но может создавать новые на основе существующих. Да. Цитата Значения-типы в частности. Ок. Цитата Так что спорить с тем, что шаблоны реализуют параметрический полиморфизм Не понимаю, как из предыдущих утверждений следует наличие параметрического полиморфизма. |
Сообщ.
#283
,
|
|
|
Вторая часть марлезонского балета. Из main_ удалена лямбда и теперь она выглядит практически как в хаскельном варианте. Эта дыра закрыта для ваших шаловливых ручонок. Ищите другие дыры:
![]() ![]() import std.stdio; class Base { int head; Base tail; this(int head, Base tail) { this.head = head; this.tail = tail; } } class List(int N) : Base { this(ARGS...)(ARGS args) { super(args); } } class ListN(int N) : List!N { this(ARGS...)(ARGS args) { super(args); } } int scalarProduct(T)(T as, T bs) { if(!as) return 0; return as.head * bs.head + scalarProduct(as.tail, bs.tail); } auto cons(int N)(int head, List!N tail) { return new ListN!1(head, tail); } auto cons(int N)(int head, ListN!N tail) { return new ListN!(N + 1)(head, tail); } List!0 nil; auto cons(int head) { return cons(head, nil); } int main_(int N)(int n, int i, List!N as, List!N bs) { if(n == 0) { return scalarProduct(as, bs); } else { return main_(n - 1, i + 1, cons(2*i + 1, as), cons(i*i, bs)); //return main_(n - 1, i + 1, cons(2*i+1, cons(1, as)), cons(i*i, cons(2, bs))); // compiles //return main_(n - 1, i + 1, cons(2*i+1, as), nil); // fails //return main_(n - 1, i + 1, cons(3, cons(2*i+1, as)), cons(i*i, bs)); // fails } } int main_(int n) { return main_(n, 0, nil, nil); //return main_(n, 0, cons(2), cons(3)); // compiles //return main_(n, 0, nil, cons(1)); // fails } void main() { int n; readf("%s", &n); main_(n).writeln; } |
Сообщ.
#284
,
|
|
|
Qraizer, applegame
Тут есть параметрический полиморфизм? ![]() ![]() class A { public: virtual void foo() { // default implementation } }; void bar(A & a) { a.foo(); } А если нет, то можете объяснить принципиальную разницу с шаблонами(в контексте нашего разговора, естественно)? Ведь ваш аргумент на счет "не специализируй" работает и тут ![]() |
Сообщ.
#285
,
|
|
|
Цитата D_KEY @ В исходном коде??? Из определения ПП следует отсутствие зависимости кода(исходного, а не бинарного) от параметров. В C++ эта зависимость существует ![]() Цитата D_KEY @ Реализация и спецификация не являются взаимоисключающими понятиями. Да, в спецификации C++ жестко указан способ реализации параметрического полиморфизма. В том и дело, что для C++ это вопрос не реализации, а спецификации языка. Добавлено Цитата Qraizer @ Решение возможно есть, но я не уверен, что это можно реализовать так, чтобы MyNameIsIgor не смог испортить applegame, задача простая даже для C++03. Подсказать? ![]() |