Здравствуйте, CodingUnit, Вы писали:
CU>Довольно странное определение, к чисто функциональным языкам относят языки неиспользующими деструктивные модификации, но в шаблонах С++ нет переменных как таковых, есть только типы и константы, порядок вычисления и поток выполнения не определен, то есть невозможно понять в каком порядке компилятор обработает их и невозможно отладить это. К тому же функциональные языки чтобы называться таковыми должны уметь выполнять типичные алгоритмы, можно ли на шаблонах построить дерево, сбалансировать, преобразовать в другой вид? Функции в этих языках первоклассные сущности, в шаблонах же нет функций как таковых преобразующих данные из одного в другой. Поэтому вряд ли их можно назвать чисто функциональным языком, это более надстройка во время компиляции для настройки системы типов, которую пытаются растянут чтобы получить некое метапрограммирование в терминах типов.
В шаблон можно передать шаблон. Шаблон есть первоклассный объект времени компиляции, аналогично функции в чисто функциональном. Для полноты достаточно альтернативы и рекурсии.
С отладкой проблемы. Но тут Просто никто не писал отладку. Представьте если бы в немерли было нельзя останавливать во время компиляции
Здравствуйте, CodingUnit, Вы писали:
CU>Довольно странное определение, к чисто функциональным языкам относят языки неиспользующими деструктивные модификации, но в шаблонах С++ нет переменных как таковых, есть только типы и константы
Операции над типами и константами недеструктивны по определению Кто-то (remark? Сложно найти, когда форум отвечает на часть запросов фразой "Language color pattern source xml stream is not valid") на forum/cpp находил способ запоминать кое-какое состояние между вызовами шаблонов, но в результате пришли к выводу, что этот спецэффект возник из-за недочёта реализации используемой фичи в компиляторах.
CU>порядок вычисления и поток выполнения не определен, то есть невозможно понять в каком порядке компилятор обработает их и невозможно отладить это.
Определён Это ещё и ленивый функциональный язык в плане получения результата — пока явно не запросишь, вычисления не будут произведены.
CU>К тому же функциональные языки чтобы называться таковыми должны уметь выполнять типичные алгоритмы, можно ли на шаблонах построить дерево, сбалансировать, преобразовать в другой вид?
Да без проблем. Дерево можно задать как набор lisp/scheme'вских cons'ов, а потом выполнить неразрушающее преобразование над ним.
CU>Функции в этих языках первоклассные сущности, в шаблонах же нет функций как таковых преобразующих данные из одного в другой.
Их заменяют типы, которые преобразуют переданные типы и тем самым ведут себя как функции.
CU>Поэтому вряд ли их можно назвать чисто функциональным языком, это более надстройка во время компиляции для настройки системы типов, которую пытаются растянут чтобы получить некое метапрограммирование в терминах типов.
Вполне можно назвать, и называют — см. аргументы выше.
Здравствуйте, Аноним, Вы писали:
А>Здравствуйте, CodingUnit, Вы писали:
А>В шаблон можно передать шаблон. Шаблон есть первоклассный объект времени компиляции, аналогично функции в чисто функциональном. Для полноты достаточно альтернативы и рекурсии.
Шаблон это не тоже что и функция, и то что он первоклассный это не говорит о том что это делает язык функциональным, как это принято понимать, типичный алгоритм не вызвать в шаблоне запустив его из другого шаблона.
А>С отладкой проблемы. Но тут Просто никто не писал отладку. Представьте если бы в немерли было нельзя останавливать во время компиляции
это и говорит о том что шаблоны не спроектированы чтобы использоваться как полноценная система метапрограммирования, а более допущение, которое пытаются использовать
и с сообщениями об ошибках тоже проблемы, даже по ним часто невозможно понять что происходит с программой на уровне шаблонов, только внешним обзором
Может кому то все же очень хочется назвать этот язык шаблонов функциональным, ну пожалуйста называйте и используйте, мы же говорим не о терминах, а чем плохи шаблоны по сравнению с макросами Н, я эту разницу показал.
Здравствуйте, CodingUnit, Вы писали:
CU>Шаблон это не тоже что и функция, и то что он первоклассный это не говорит о том что это делает язык функциональным, как это принято понимать, типичный алгоритм не вызвать в шаблоне запустив его из другого шаблона.
Шаблон представляет собой чистую функцию, позволяющие запускать другие алгоритмы (написанные на шаблонах) из другого шаблона.
CU>это и говорит о том что шаблоны не спроектированы чтобы использоваться как полноценная система метапрограммирования, а более допущение, которое пытаются использовать
Никто не спорит с этим, а вот со следующим:
CU>Может кому то все же очень хочется назвать этот язык шаблонов функциональным, ну пожалуйста называйте и используйте, мы же говорим не о терминах, а чем плохи шаблоны по сравнению с макросами Н, я эту разницу показал.
Спор разгорелся как раз из-за терминов — странного определения тьюринг-полноты.
Никто в ветке не умаляет значимости макросов Nemerle (возможность общаться с системой прямо во время компиляции шикарна) и не хвалит шаблоны плюсов, но оценивать тьюринг-полноту по чтению/записи файлов это же не дело
Здравствуйте, CodingUnit, Вы писали:
CU>Может кому то все же очень хочется назвать этот язык шаблонов функциональным, ну пожалуйста называйте и используйте, мы же говорим не о терминах, а чем плохи шаблоны по сравнению с макросами Н, я эту разницу показал.
Шаблоны сложны в отладке так как не поддерживаются иде в отличии от макросов. Шаблоны медленны из за того что работают фактически в текстовом виде и не поддерживается компиляция шаблонов в отличии от макросов. Шаблоны сложны в понимании так как являются чистым функциональным языком в отличии от более привычным императивных. Как в чистом функциональном есть проблемы ввода вывода. Шаблоны в отличии от макросов не содержат сайтэффектов. Шаблоны не позволяют создавать произвольный синтаксис. Шаблоны близки к доказательному программированию
Здравствуйте, Alexey F, Вы писали:
AF>Здравствуйте, CodingUnit, Вы писали:
CU>>Довольно странное определение, к чисто функциональным языкам относят языки неиспользующими деструктивные модификации, но в шаблонах С++ нет переменных как таковых, есть только типы и константы AF>Операции над типами и константами недеструктивны по определению Кто-то (remark? Сложно найти, когда форум отвечает на часть запросов фразой "Language color pattern source xml stream is not valid") на forum/cpp находил способ запоминать кое-какое состояние между вызовами шаблонов, но в результате пришли к выводу, что этот спецэффект возник из-за недочёта реализации используемой фичи в компиляторах.
CU>>К тому же функциональные языки чтобы называться таковыми должны уметь выполнять типичные алгоритмы, можно ли на шаблонах построить дерево, сбалансировать, преобразовать в другой вид? AF>Да без проблем. Дерево можно задать как набор lisp/scheme'вских cons'ов, а потом выполнить неразрушающее преобразование над ним.
Вот это не вполне понятно как можно произвести любое преобразование над любым деревом в шаблоне, например балансировку, поясните примером
CU>>Функции в этих языках первоклассные сущности, в шаблонах же нет функций как таковых преобразующих данные из одного в другой. AF>Их заменяют типы, которые преобразуют переданные типы и тем самым ведут себя как функции.
А как запустить шаблон из шаблона, с новыми аргументами?
AF>Вполне можно назвать, и называют — см. аргументы выше.
Но все же говоря о теме, мы говорим чем они плохи по сравнению с Н, если и попытаться поставить их в разряд чисто функциональных языков, но не дает никакого преимущества
Здравствуйте, Alexey F, Вы писали:
AF>Шаблон представляет собой чистую функцию, позволяющие запускать другие алгоритмы (написанные на шаблонах) из другого шаблона.
С этим очень много ограничений, например помоему невозможно вызвать шаблон T с параметрами шаблона T<T2, T3>, ведь T еще не определен, тут придется изловчаться с инстанционированием
AF>Спор разгорелся как раз из-за терминов — странного определения тьюринг-полноты. AF>Никто в ветке не умаляет значимости макросов Nemerle (возможность общаться с системой прямо во время компиляции шикарна) и не хвалит шаблоны плюсов, но оценивать тьюринг-полноту по чтению/записи файлов это же не дело
Может я не так понимал тьюринг полноту, я просто сразу вижу что на С++ я могу написать любую программу, а на шаблонах нет. Действительно вопрос вроде ясен, если даже и оставить все эти термины за шаблонами.
Здравствуйте, Аноним, Вы писали:
А>Просто писать после императивного в чисто функциональном тяжело. Не понимаешь почему надо писать кучу кода вместо обычного императива. У вас есть опыт написания на чисто функциональном?
Не знаю как на чистом, но на Haskell вместо кучи императивного кода приходится писать несколько строчек функционального.
Здравствуйте, CodingUnit, Вы писали:
CU>Может я не так понимал тьюринг полноту, я просто сразу вижу что на С++ я могу написать любую программу, а на шаблонах нет. Действительно вопрос вроде ясен, если даже и оставить все эти термины за шаблонами.
А спор был только из-за термина тьюринг-полноты. Шаблоны и brainfuck у нас так, под руку подвернулись . (Возможно, я повторяюсь, пару раз форум ошибку выплёвывал)
CU>С этим очень много ограничений, например помоему невозможно вызвать шаблон T с параметрами шаблона T<T2, T3>, ведь T еще не определен, тут придется изловчаться с инстанционированием
Можно:
template<class T, class U>
struct Node {
typedef T head;
typedef U tail;
};
template<class T, class U>
struct Test2 {
typedef Node<T, U> result;
};
template<template<class, class> class T, class U, class Z>
struct Test {
typedef typename T<U, Z>::result result;
};
typedef Test<Test2, int, double>::result A;
Можно свести к синтаксису T::Func<A, B>, если изменить Test2.
Здравствуйте, CodingUnit, Вы писали:
CU>Довольно странное определение, к чисто функциональным языкам относят языки неиспользующими деструктивные модификации, но в шаблонах С++ нет переменных как таковых, есть только типы и константы, порядок вычисления и поток выполнения не определен, то есть невозможно понять в каком порядке компилятор обработает их и невозможно отладить это.
Скажешь это не программа на чистом функциональном языке? http://www.rsdn.ru/forum/philosophy/1910243.1.aspx
WH>Там есть функция MergeSort которая принимает список и предикат Int2TypeLess.
Да наверное это можно назвать программу на чисто функциональном языке, но до чего страшный код, это все же более похоже на нестандартное применение к чему шаблоны не предназначены.
Здравствуйте, catbert, Вы писали:
C>Что-то мне кажется, что сделать шаблоны из макросов Nemerle — не запросто.
Никаких проблем с этим нет. Проблема в том, что по юзабельности он будет таким же убогим как и шаблоны. Никакого интелисенса, мало-понятные сообщения об ошибках. И почти никакого толку.
В общем, и целом дженерики решают проблему обобщенного программирования. А шаблоны С++ интересны, в основном, своими возможностями метапрограммирования. Но в этой области макросам нет равных. И уж эмулировать МП на шаблонах созданных на базе макросов просто глупо.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, Аноним, Вы писали:
А>собственно какие возражения против шаблонов? Чем они отличаются от функциональнозапрограммированых макросов
Анализ кода?
например можно сделать проверку функции на чистоту(правда никто пока не заморачивался) или статическую проверку контрактов целевой функции
удаление или модификация кода?
хотя это и в Н не приветствуется.
уже говорили, но повторюсь
введение синтаксиса,
ввод-вывод
и ещё много много того что невозможно либо очень трудно сделать в шаблонах но легко либо не очень сложно в Н
Re[2]: чем плохи шаблоны?
От:
Аноним
Дата:
04.02.12 19:28
Оценка:
Здравствуйте, para, Вы писали:
P>Здравствуйте, Аноним, Вы писали:
А>>собственно какие возражения против шаблонов? Чем они отличаются от функциональнозапрограммированых макросов
P>попробуйте написать парсер с#? P>посмотрите на сложность кода? P>сравните как это сделано в Н. через год расскажите
вообще то сделали на спирит. Правда дефакто не более чем демонстрация принципиальной возможности
>Вот это не вполне понятно как можно произвести любое преобразование над любым деревом в шаблоне, например балансировку, поясните примером
Балансировка оказалась крепким орешком. Я не знаю, что я делал дольше — писал реализацию на Scheme в функциональном стиле или переводил на шаблоны C++. Функциональный стиль для некоторых алгоритмов мне не даётся до сих пор
Поэтому я позволил себе некоторую роскошь: вместо cons взял более привычный императивщикам (struct Node (value left right)) и цвет оставил прямо в структуре узла: (struct Node (value left right color)). Исходник на Scheme приводить не буду, т.к. он до страшного упрощён, чтобы было легче переводить в шаблоны, а результат — ниже.
Алгоритм принимает на вход сбалансированное бинарное дерево (именно дерево, не представляющий дерево список) и балансирует его. Вывод результатов ради удобства форматирования сделан в runtime.
Здравствуйте, Аноним, Вы писали:
А>Что мешает эту прагму использовать в шаблонах и получать сообщения об ошибках? Эта прагма не более чем printf
Мешают сразу две вещи.
1. Прагма не является частью языка и не может быть испльзована в переносимомо коде.
2. Она выведет сообщение не во время воплощения (инстанциации, как это дело часто называют) шаблона, и не в зависимости от условий, а тупо при обработке компилятором строки файла в котором она применяется.
Короче, вот тебе простой макрос. Попробуй его повторить на С++:
macro Hello(name : string, count : int)
{
if (count <= 0)
Message.Error("The parameter 'count' must be greater than 0.");
else repeat (count)
Message.Hint($"Hello, $name!");
<[ () ]> // ничего не генерировать в программе
}
И это еще так, цветочки. Макросы в отличии от шаблонов ведь могут анализировать код, читать данные из внешних источников (вплоть до баз данных), типизировать полученные выражения и генерировать, на основании всего этого специализированный код. Причем код макроса — это откомпилированный код по скорости не отличающийся от кода самого компилятора. В отличии от шаблонов, вычисления в которых делаются на побочных эффектах весьма дорогостоящих операций вроде рекурсивного воплощения шаблонов.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, Alexey F, Вы писали:
AF>Никто в ветке не умаляет значимости макросов Nemerle (возможность общаться с системой прямо во время компиляции шикарна) и не хвалит шаблоны плюсов, но оценивать тьюринг-полноту по чтению/записи файлов это же не дело
Вообще-то умаляет и хвалит. Но с тюринг-полнотой CodingUnit действительно путает. Это распространенное заблуждение — подмена понятия отсутствие ограничений в доступе к данным и полноту по тьюрингу.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.