Здравствуйте, x-code, Вы писали:
XC>В объявлении шаблонов оставить все как есть, обычные угловые скобки XC>При создании объектов вроде достаточно добавить какой-нибудь символ, и все, неопределенностей нет. XC>например ! как в Ди.
В наш унокодный век можно уже использовать в синтаксисе языков всё великое множество скобок и кавычек. () [] {} "" '' “” ‘’ «» ⁅⁆ 〈〉 《》 「」 『』 【】 〔〕 〖〗 〘〙 〚〛
Здравствуйте, x-code, Вы писали:
XC>Здравствуйте, Sinix, Вы писали:
S>>Что надо быть последовательным. Или используем токен '!<' и в объявлении, и в использовании шаблона, или (лично я за этот вариант) не расширяем синтаксис ради поддержки некрасивого кода.
XC>Ну можно и в объявлении. Вопрос-то был в том, решает ли такое расширение проблемы неоднозначностей, которые есть в С++/C#?
в C# выражения в параметрах жаблона недопустимы, на сколько я знаю.
Но насчет остального — по-моему надо и перед закрывающей скобкой неоднозначность убирать.
foo!<A > B > x;
Здравствуйте, Sinix, Вы писали: AC>>Автоматически подменяется на: class MyGeneric〈T〉 S>Тогда уж проще временно подменять прямо в IDE. И вам хорошо, и остальным не мучаться.
Почему бы и нет.
Между тем,что я думаю,тем,что я хочу сказать,тем,что я,как мне кажется,говорю,и тем,что вы хотите услышать,тем,что как вам кажется,вы слышите,тем,что вы понимаете,стоит десять вариантов возникновения непонимания.Но всё-таки давайте попробуем...(Э.Уэллс)
, прочитал все по несколько раз Но так и не понял до конца, в чем там фишка.
На самом деле самому интересно, в том числе с точки зрения собственного разрабатываемого языка программирования. Какие неоднозначности возникают в связи с тем, что для угловых скобок, операторов больше меньше и сдвигов используются одни и те же символы?
С одной стороны, в С,С++,Java,C#,Delphi — т.е. в основных языках, используются <>. Поэтому в любом новом языке хорошо бы оставить именно <>. С другой стороны, ясно что неоднозначности есть и наверняка они будут мешать. Подумал и придумал свой вариант.
В объявлении шаблонов оставить все как есть, обычные угловые скобки
//c#
class MyGeneric<T>
{
T data[100];
}
//c++
template<int N>
int get(int x)
{
return N*x;
}
При создании объектов вроде достаточно добавить какой-нибудь символ, и все, неопределенностей нет.
например ! как в Ди.
MyGeneric!<int> foo;
int a = get!<10>(20);
Если поймали спецсивол и следом за ним "<", то это открывающая угловая скобка, и компилятор ожидает, что будет закрывающая, соответственно символ '>' интерпретируем именно как закрывающую угловую скобку. Иначе тупо интерпретируем ее как знак "меньше". Кому надо заюзать операцию сравнения или сдвига внутри аргумента шаблона — пусть юзают круглые скобки как обычно для приотиретов операций. И всякие сдвиги ">>" и "<<" тупо считать сдвигами и также кому надо — пусть юзают круглые скобки.
int a = get!< ((9>8)<<2) >(20);
Преимущества: везде используются родные угловые скобочки, мозг ломать не надо. И дополнительный спецсимвол вроде как(???) снимает неоднозначности.
Что думаете?
, прочитал все по несколько раз Но так и не понял до конца, в чем там фишка.
XC>На самом деле самому интересно, в том числе с точки зрения собственного разрабатываемого языка программирования. Какие неоднозначности возникают в связи с тем, что для угловых скобок, операторов больше меньше и сдвигов используются одни и те же символы?
XC>С одной стороны, в С,С++,Java,C#,Delphi — т.е. в основных языках, используются <>. Поэтому в любом новом языке хорошо бы оставить именно <>. С другой стороны, ясно что неоднозначности есть и наверняка они будут мешать. Подумал и придумал свой вариант.
XC>Преимущества: везде используются родные угловые скобочки, мозг ломать не надо. И дополнительный спецсимвол вроде как(???) снимает неоднозначности. XC>Что думаете?
Мне нравится подход Scala — для шаблонов используются угловые скобки. Для адресации массивов используются круглые скобки. Впрочем это наверное не очень традиционно, но читаемость хорошая.
Здравствуйте, Centaur, Вы писали:
C>В наш унокодный век можно уже использовать в синтаксисе языков всё великое множество скобок и кавычек. () [] {} "" '' “” ‘’ «» ⁅⁆ 〈〉 《》 「」 『』 【】 〔〕 〖〗 〘〙 〚〛
Здравствуйте, Centaur, Вы писали:
C>Здравствуйте, x-code, Вы писали:
XC>>В объявлении шаблонов оставить все как есть, обычные угловые скобки XC>>При создании объектов вроде достаточно добавить какой-нибудь символ, и все, неопределенностей нет. XC>>например ! как в Ди.
C>В наш унокодный век можно уже использовать в синтаксисе языков всё великое множество скобок и кавычек. () [] {} "" '' “” ‘’ «» ⁅⁆ 〈〉 《》 「」 『』 【】 〔〕 〖〗 〘〙 〚〛
Здравствуйте, Centaur, Вы писали:
C>Здравствуйте, x-code, Вы писали:
XC>>В объявлении шаблонов оставить все как есть, обычные угловые скобки XC>>При создании объектов вроде достаточно добавить какой-нибудь символ, и все, неопределенностей нет. XC>>например ! как в Ди.
C>В наш унокодный век можно уже использовать в синтаксисе языков всё великое множество скобок и кавычек. () [] {} "" '' “” ‘’ «» ⁅⁆ 〈〉 《》 「」 『』 【】 〔〕 〖〗 〘〙 〚〛
Здравствуйте, hardcase, Вы писали:
C>>В наш уникодный век можно уже использовать в синтаксисе языков всё великое множество скобок и кавычек. () [] {} "" '' “” ‘’ «» ⁅⁆ 〈〉 《》 「」 『』 【】 〔〕 〖〗 〘〙 〚〛
H>Тяжко набирать
Редакторы клавиатурных раскладок есть под все распространённые платформы.
Здравствуйте, x-code, Вы писали:
XC>Преимущества: везде используются родные угловые скобочки, мозг ломать не надо. И дополнительный спецсимвол вроде как(???) снимает неоднозначности. XC>Что думаете?
Что надо быть последовательным. Или используем токен '!<' и в объявлении, и в использовании шаблона, или (лично я за этот вариант) не расширяем синтаксис ради поддержки некрасивого кода.
Здравствуйте, Sinix, Вы писали:
S>Что надо быть последовательным. Или используем токен '!<' и в объявлении, и в использовании шаблона, или (лично я за этот вариант) не расширяем синтаксис ради поддержки некрасивого кода.
Ну можно и в объявлении. Вопрос-то был в том, решает ли такое расширение проблемы неоднозначностей, которые есть в С++/C#?
XC>Ну можно и в объявлении. Вопрос-то был в том, решает ли такое расширение проблемы неоднозначностей, которые есть в С++/C#?
Для шарпа — решает, но я бы подождал nikov-а Толку правда 0 — в c# оно всплывёт хорошо если раз в 10 лет.
Здравствуйте, samius, Вы писали:
S>Но насчет остального — по-моему надо и перед закрывающей скобкой неоднозначность убирать. S>foo!<A > B > x;
А смысл? Насколько часто в параметры шаблонов пихают операторы сравнения? Я в реальном коде ни разу не видел
Поэтому достаточно так.
foo!< (A>B) > x;
Ведь никого же не смущает, что у умножения приоритет больше чем у сложения? Вот и здесь будет правило — приоритет операторов сравнения больше чем у шаблонных скобок. А символ '!' фактически меняет этот приоритет "локально". т.е. если попадаются два токена ! и вслед за ним < — то следующий токен '>' на этом скобочном уровне будет "закрывающая угловая скобка", а не "больше".
Т.е. это не часть оператора <>, а что-то вроде аналога ключевого слова template в примере
.
Если же ввести еще символ, то получатся фактически двухсимвольные скобки, против чего выступало большинство в том обсуждении. Не знаю почему, то форма с дополнительным символом воспринимается гораздо легче, чем тяжеловесные двойные скобки (хотя казалось бы — тут три символа, там четыре, вроде не особо большая разница).
Здравствуйте, x-code, Вы писали:
XC>Здравствуйте, samius, Вы писали:
S>>Но насчет остального — по-моему надо и перед закрывающей скобкой неоднозначность убирать. S>>foo!<A > B > x;
XC>А смысл? Насколько часто в параметры шаблонов пихают операторы сравнения? Я в реальном коде ни разу не видел XC>Поэтому достаточно так. XC>foo!< (A>B) > x;
Если разбор имеет доступ к ресолву имен, то достаточно и без "!". А если не имеет доступ, то это означает что может быть путаница с любым дополнительным символом, при наличии возможности вводить пользовательские операторы (вроде !<).
Так что в общем случае дополнительный символ может решить проблемы лишь там, где нет возможности определять операторы с этим символом.
XC>Если же ввести еще символ, то получатся фактически двухсимвольные скобки, против чего выступало большинство в том обсуждении. Не знаю почему, то форма с дополнительным символом воспринимается гораздо легче, чем тяжеловесные двойные скобки (хотя казалось бы — тут три символа, там четыре, вроде не особо большая разница).
То есть стоит задача отличить шаблон от выражения без ресолва имен?
Здравствуйте, samius, Вы писали:
XC>>Если же ввести еще символ, то получатся фактически двухсимвольные скобки, против чего выступало большинство в том обсуждении. Не знаю почему, то форма с дополнительным символом воспринимается гораздо легче, чем тяжеловесные двойные скобки (хотя казалось бы — тут три символа, там четыре, вроде не особо большая разница).
S>То есть стоит задача отличить шаблон от выражения без ресолва имен?
Думаю, что так было бы удобнее. Хотя на самом деле просто интересно — как удобнее — и с точки зрения написания копилятора, и с точки зрения написания программ на языке.
Здравствуйте, x-code, Вы писали:
XC>Думаю, что так было бы удобнее. Хотя на самом деле просто интересно — как удобнее — и с точки зрения написания копилятора, и с точки зрения написания программ на языке.
Лично я — за меньший визуальный шум. Программы читаются куда чаще, чем пишутся и, имхо, заставлять вглядываться в разницу между < и !< такое же преступление, как использовать одинарную точку для обозначения диапазона в индексаторе (я даже не знаю, где я такой изврат видел, но сам факт запомнился).
Здравствуйте, hardcase, Вы писали: C>>В наш унокодный век можно уже использовать в синтаксисе языков всё великое множество скобок и кавычек. () [] {} "" '' “” ‘’ «» ⁅⁆ 〈〉 《》 「」 『』 【】 〔〕 〖〗 〘〙 〚〛 H>Тяжко набирать
Как вариант, можно подменять на юнискобки сразу после ввода, но нужна поддержка со стороны IDE.
То есть например, вводим: class MyGeneric<T>
Автоматически подменяется на: class MyGeneric〈T〉
Между тем,что я думаю,тем,что я хочу сказать,тем,что я,как мне кажется,говорю,и тем,что вы хотите услышать,тем,что как вам кажется,вы слышите,тем,что вы понимаете,стоит десять вариантов возникновения непонимания.Но всё-таки давайте попробуем...(Э.Уэллс)
Здравствуйте, AlexCab, Вы писали:
AC>Как вариант, можно подменять на юнискобки сразу после ввода, но нужна поддержка со стороны IDE. AC>То есть например, вводим: class MyGeneric<T> AC>Автоматически подменяется на: class MyGeneric〈T〉
После чего дампим исходник на простенькую консольку и получаем:
class MyGeneric&My_first_very_readable_symbol_1;T&My_second_very_readable_symbol2;
И сиди потом читай эту галиматью.
P.S. И не надо рассказывать про 100% юникодность всех консолей в 21 веке. Нет этого и не надо.
Здравствуйте, Murom, Вы писали: AC>>Как вариант, можно подменять на юнискобки сразу после ввода, но нужна поддержка со стороны IDE. M>После чего дампим исходник на простенькую консольку ...
Зачем дампить исходный код на консоль?
Между тем,что я думаю,тем,что я хочу сказать,тем,что я,как мне кажется,говорю,и тем,что вы хотите услышать,тем,что как вам кажется,вы слышите,тем,что вы понимаете,стоит десять вариантов возникновения непонимания.Но всё-таки давайте попробуем...(Э.Уэллс)
Здравствуйте, AlexCab, Вы писали:
AC>Автоматически подменяется на: class MyGeneric〈T〉
Тогда уж проще временно подменять прямо в IDE. И вам хорошо, и остальным не мучаться.
Здравствуйте, Murom, Вы писали:
M>После чего дампим исходник на простенькую консольку и получаем:
Для несчастных пользователей древних консолек люди придумали ди- и триграфы. А другие умные люди придумали правило никогда их не использовать без абсолютной необходимости.
Здравствуйте, hardcase, Вы писали:
C>>В наш унокодный век можно уже использовать в синтаксисе языков всё великое множество скобок и кавычек. () [] {} "" '' “” ‘’ «» ⁅⁆ 〈〉 《》 「」 『』 【】 〔〕 〖〗 〘〙 〚〛
H>Тяжко набирать
Да набор — это чисто техническая проблема, а потому решаемая. Достаточно сделать спец-шорткаты.
Намного важнее социальные проблемы. Юникод будет перодически убиваться. Где-то форум юникод не поддерживает, где-то человек лохонулся.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, x-code, Вы писали:
XC>Ну можно и в объявлении. Вопрос-то был в том, решает ли такое расширение проблемы неоднозначностей, которые есть в С++/C#?
Решает. По сути так в Nemerle и сделано. Там используется "." для устранения неоднозначности между индексированным доступом и описанием типа. Вот только многим это не нравится. Точку часто называют "уродливой".
С "<" все еще хуже, так как скобки должны быть сбалансированными, а "<" и ">" используются в выражениях по отдельности. В C# из-за этого ввели очень уродливую эвристику:
7.6.4.2 Grammar ambiguities
The productions for simple-name (§7.6.2) and member-access (§7.6.4) can give rise to ambiguities in the grammar for expressions. For example, the statement:
F(G<A,B>(7));
could be interpreted as a call to F with two arguments, G < A and B > (7). Alternatively, it could be interpreted as a call to F with one argument, which is a call to a generic method G with two type arguments and one regular argument.
If a sequence of tokens can be parsed (in context) as a simple-name (§7.6.2), member-access (§7.6.4), or pointer-member-access (§18.5.2) ending with a type-argument-list (§4.4.1), the token immediately following the closing > token is examined. If it is one of
( ) ] } : ; , . ? == != | ^
then the type-argument-list is retained as part of the simple-name, member-access or pointer-member-access and any other possible parse of the sequence of tokens is discarded. Otherwise, the type-argument-list is not considered to be part of the simple-name, member-access or pointer-member-access, even if there is no other possible parse of the sequence of tokens. Note that these rules are not applied when parsing a type-argument-list in a namespace-or-type-name (§3.8). The statement
F(G<A,B>(7));
will, according to this rule, be interpreted as a call to F with one argument, which is a call to a generic method G with two type arguments and one regular argument. The statements
F(G < A, B > 7);
F(G < A, B >> 7);
will each be interpreted as a call to F with two arguments. The statement
x = F < A > +y;
will be interpreted as a less than operator, greater than operator, and unary plus operator, as if the statement had been written x = (F < A) > (+y), instead of as a simple-name with a type-argument-list followed by a binary plus operator. In the statement
x = y is C<T> + z;
the tokens C<T> are interpreted as a namespace-or-type-name with a type-argument-list.
Если в условиях языка с фиксированным синтаксисом это еще приемлемо (хотя и вызывает проблемы), то в условиях языка с расширяемым синтаксисом — это практически не приемлемо.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Обдумывал недавно "идеальную" систему метапрограммирования, достаточно простую и в то же время мощную, способную заменить препроцессор (#define), и объединяющую шаблоны в стиле С++ и макросы в стиле Nemerle. И в частности возникла мысль: а почему в шаблонах не используются обычные круглые скобки? Только из соображений общей перегруженности круглых скобок другими функциями? Или есть какие-то особые причины?
Здравствуйте, x-code, Вы писали:
XC>Обдумывал недавно "идеальную" систему метапрограммирования, достаточно простую и в то же время мощную, способную заменить препроцессор (#define), и объединяющую шаблоны в стиле С++ и макросы в стиле Nemerle. И в частности возникла мысль: а почему в шаблонах не используются обычные круглые скобки? Только из соображений общей перегруженности круглых скобок другими функциями? Или есть какие-то особые причины?
Здравствуйте, x-code, Вы писали:
XC>Обдумывал недавно "идеальную" систему метапрограммирования, достаточно простую и в то же время мощную, способную заменить препроцессор (#define), и объединяющую шаблоны в стиле С++ и макросы в стиле Nemerle. И в частности возникла мысль: а почему в шаблонах не используются обычные круглые скобки? Только из соображений общей перегруженности круглых скобок другими функциями? Или есть какие-то особые причины?
Сугубо мне лично скаловские квадратные скобки воспринимаются легче, чем плюсовые угловые. Приведенные рядом круглые скобки из D — ещё лучше, и ключевой момент здесь — единство стиля. В этом плане здорово сделано в Хаскеле — объявление и вызов функций, декларация типов и конструкторов данных — выглядит всё похоже, для параметров вообще нет никаких скобок (ну кроме туплов, выделения вычислений и пр.). Хотя в хаскеле иногда в коде не хватает скобок при вызове функций — так иногда проще разобраться. А в языках всякие угловые скобки и прочие спецсимволы всё-таки создают левый шум. Например, можно в редакторе одновременно попереключаться с кода на код: С++ -> Go (по синтаксису близкий к С, но с меньшей кашей, чем С++) -> Lua (чем-то напоминающий Go, здесь есть местами и {}, но ещё меньше шума — нет всяких указателей и взятий адресов, звёздочка только как оператор). Вполне чувствуется разница.
А в рамках "идеальной" системы метапрограммирования для императивного языка я для себя пришёл к выводу, что это должен быть язык с синтаксисом на базе Go и Lua, с простыми элементами функциональщины из таких язычков как CoffeeScript и ему подобный MoonScript (возможно, задействовать и принцип отступов), без ОПП и с концепциями похожими на интерфейсы в Go или классы типов в хаскеле или типы и протоколы в кложуре. А мета-система — в стиле MetaLua, но со статическим контролем типов во время компиляции, при этом расширение синтаксиса базового языка — под большим вопросом. Язык должен позволять некий fluent DSL, как, например, такие фишки в груви как концепция билдеров, Command chains (очень красиво и просто), GPath и т.п., т.е. всё в рамках основного простого (!!!) языка. А метапрограммирование должно выполнять вычесления на этапе компиляции, со всеми большими возможностями, доступные платформе, вплоть до парсинга внешних файлов, чтение данных из СУБД и пр., и помогать контролируемо генерировать основной код, т.е. где-то неявно добавить функции, структуры, переменные, сам вычислительный код и т.д. и т.п.
В какой-то мере — это путь к лиспу, но с более человеко-читаемым синтаксисом.
Сорри за небольшой офтоп, просто у самого сейчас в голове летают мысли по поводу своего язычка-DSL.
Здравствуйте, x-code, Вы писали:
XC>На самом деле самому интересно, в том числе с точки зрения собственного разрабатываемого языка программирования. Какие неоднозначности возникают в связи с тем, что для угловых скобок, операторов больше меньше и сдвигов используются одни и те же символы?
А зачем вообще эти угловые скобки для параметров шаблонов/генериков использовать?
В принципе, можно вообще круглыми обойтись и указывать типы-параметры на общих основаних с обычными параметрами.
Например, вот обычное объявление генерик-функции — с угловыми скобками:
// объявлениеpublic T GetValue<T>(string key)
{
...
}
// вызовint x = GetValue<int>("x");
А вот то же, но с круглыми скобками, где тип-параметр ничем не отличается от обычнаго параметра:
// объявлениеpublic T GetValue(Type T, string key)
{
...
}
// вызовint x = GetValue(int, "x");
Здесь обычное объявление генерик-класса — с угловыми скобками:
// объявлениеpublic class MyClass<T, K>
{
...
}
// создание
MyClass<int, string> c = new MyClass<int, string>();
А здесь — с круглыми скобками:
// объявлениеpublic class MyClass(Type T, Type K)
{
...
}
// создание
MyClass(int, string) y = new MyClass(int, string);
В таком синтаксисе возможны некоторые нюансы, но вроде ничего принципиально неразрешимого нет.
Здравствуйте, sgrape, Вы писали:
S>А зачем вообще эти угловые скобки для параметров шаблонов/генериков использовать? S>В принципе, можно вообще круглыми обойтись и указывать типы-параметры на общих основаних с обычными параметрами.
S>А вот то же, но с круглыми скобками, где тип-параметр ничем не отличается от обычнаго параметра: S>
S>// объявление
S>public T GetValue(Type T, string key)
S>{
S>}
S>// вызов
S>int x = GetValue(int, "x");
S>
S>В таком синтаксисе возможны некоторые нюансы, но вроде ничего принципиально неразрешимого нет.
Есть. Параметры шаблонов и параметры функций — это совершенно разные сущности, приводящие к совершенно разным последствиям в процессе компиляции. Шаблоны — это по сути "квазицитаты", и когда вы передаете в шаблон какой-то параметр, вы инициируете подстановку одного фрагмента AST — параметра — в другой — сам шаблон, это дополнительная операция, совершенно не имеющая никакого отношения к передаче параметров в функцию. Не забывайте, что кроме типов, параметрами шаблонов в общем случае может быть что угодно — на самом деле любой корректный фрагмент AST языка, то есть и константы, и типы, и функции, и выражения, и даже блоки кода. То, что это почему-то не реализовано в известных языках — другой вопрос.
На самом деле я пришел к выводу, действительно от угловых скобок стоит отказаться и перейти к круглым со спецсимволом перед ними для чисто визуальной красоты. Как в Ди.
Здравствуйте, x-code, Вы писали:
XC>Здравствуйте, sgrape, Вы писали:
S>>А зачем вообще эти угловые скобки для параметров шаблонов/генериков использовать? S>>В принципе, можно вообще круглыми обойтись и указывать типы-параметры на общих основаних с обычными параметрами.
S>>А вот то же, но с круглыми скобками, где тип-параметр ничем не отличается от обычнаго параметра: S>>
S>>// объявление
S>>public T GetValue(Type T, string key)
S>>{
S>>}
S>>// вызов
S>>int x = GetValue(int, "x");
S>>
S>>В таком синтаксисе возможны некоторые нюансы, но вроде ничего принципиально неразрешимого нет.
XC>Есть. Параметры шаблонов и параметры функций — это совершенно разные сущности, приводящие к совершенно разным последствиям в процессе компиляции. Шаблоны — это по сути "квазицитаты", и когда вы передаете в шаблон какой-то параметр, вы инициируете подстановку одного фрагмента AST — параметра — в другой — сам шаблон, это дополнительная операция, совершенно не имеющая никакого отношения к передаче параметров в функцию. Не забывайте, что кроме типов, параметрами шаблонов в общем случае может быть что угодно — на самом деле любой корректный фрагмент AST языка, то есть и константы, и типы, и функции, и выражения, и даже блоки кода. То, что это почему-то не реализовано в известных языках — другой вопрос.
XC>На самом деле я пришел к выводу, действительно от угловых скобок стоит отказаться и перейти к круглым со спецсимволом перед ними для чисто визуальной красоты. Как в Ди.
Имхо, лучше вообще без скобок, если жизнь позволяет, например, когда кроме типов больше ничего не нужно. Повторюсь, здесь есть чему поучиться у хаскеля.
Вот простейший условный псевдо-код:
// что-то близкое к С++, здесь угловые скобки терпимы,
// но в целом в С++ они не приятныint some_func(int arg, MyType<int, string> data)
// через квадратные скобки - в большинстве случаев они приятнее,
// правда здесь не очень показательноint some_func(int arg, MyType[int, string] data)
// через круглые - имеем вложенные скобки на пустом месте
// в объявлении функции, возможны гараздо хуже ситуации,
// когда подряд будут )))...int some_func(int arg, MyType(int, string) data)
//вот вообще без скобок в около-сишном Go
func some_func(arg int, data chan int) res int
В Go тип chan полиморфен и встроенный, других кроме встроенных полиморфных типов пока нет. Здесь приятна сама идея. Имхо, гугловцы не зря вместо сишного способа взяли ML-паскале-подобный способ записи типов, т.е. справа, и без лишней шелухи, тех же двоеточий.
Здравствуйте, x-code, Вы писали:
XC>Шаблоны — это по сути "квазицитаты", и когда вы передаете в шаблон какой-то параметр, вы инициируете подстановку одного фрагмента AST — параметра — в другой — сам шаблон
В случае С#, примеры на котором были приведены, никакой подстановки AST в шаблон не производится.
... << RSDN@Home 1.2.0 alpha 5 rev. 21 on Windows 7 6.1.7601.65536>>
Здравствуйте, PSV100, Вы писали:
XC>>Есть. Параметры шаблонов и параметры функций — это совершенно разные сущности, приводящие к совершенно разным последствиям в процессе компиляции. Шаблоны — это по сути "квазицитаты", и когда вы передаете в шаблон какой-то параметр, вы инициируете подстановку одного фрагмента AST — параметра — в другой — сам шаблон, это дополнительная операция, совершенно не имеющая никакого отношения к передаче параметров в функцию. Не забывайте, что кроме типов, параметрами шаблонов в общем случае может быть что угодно — на самом деле любой корректный фрагмент AST языка, то есть и константы, и типы, и функции, и выражения, и даже блоки кода. То, что это почему-то не реализовано в известных языках — другой вопрос.
В дополнение. Имхо, в шаблонах лучше кроме типов больше ничего и не иметь, т.е. гараздо проще, лучше и безопаснее иметь простую полиморфную систему. То, что в С++ пытаются метапрограммировать через шаблоны — это костыль костылём погоняет, использование инструмента не по назначению, и это вынужденная мера, т.к. альтернативы нет, а потребность есть. Но если делать какую-то систему для себя, зачем искусственно себя костылить? Имхо, весьма приятнее простой параметрический полиморфизм плюс наколенный Немерл, например, по мотивам принципов и синтаксиса (!) MetaLua — одна из более-менее человечных систем в этом классе.