Re: Скобочки для templates
От: Centaur Россия  
Дата: 04.09.11 17:42
Оценка: :)
Здравствуйте, x-code, Вы писали:

XC>В объявлении шаблонов оставить все как есть, обычные угловые скобки

XC>При создании объектов вроде достаточно добавить какой-нибудь символ, и все, неопределенностей нет.
XC>например ! как в Ди.

В наш унокодный век можно уже использовать в синтаксисе языков всё великое множество скобок и кавычек. () [] {} "" '' “” ‘’ «» ⁅⁆ 〈〉 《》 「」 『』 【】 〔〕 〖〗 〘〙 〚〛
Re[3]: Скобочки для templates
От: samius Япония http://sams-tricks.blogspot.com
Дата: 05.09.11 05:29
Оценка: +1
Здравствуйте, x-code, Вы писали:

XC>Здравствуйте, Sinix, Вы писали:


S>>Что надо быть последовательным. Или используем токен '!<' и в объявлении, и в использовании шаблона, или (лично я за этот вариант) не расширяем синтаксис ради поддержки некрасивого кода.


XC>Ну можно и в объявлении. Вопрос-то был в том, решает ли такое расширение проблемы неоднозначностей, которые есть в С++/C#?

в C# выражения в параметрах жаблона недопустимы, на сколько я знаю.
Но насчет остального — по-моему надо и перед закрывающей скобкой неоднозначность убирать.
foo!<A > B > x;
Re[5]: Скобочки для templates
От: AlexCab LinkedIn
Дата: 05.09.11 13:51
Оценка: +1
Здравствуйте, Sinix, Вы писали:
AC>>Автоматически подменяется на: class MyGeneric〈T〉
S>Тогда уж проще временно подменять прямо в IDE. И вам хорошо, и остальным не мучаться.

Почему бы и нет.
Между тем,что я думаю,тем,что я хочу сказать,тем,что я,как мне кажется,говорю,и тем,что вы хотите услышать,тем,что как вам кажется,вы слышите,тем,что вы понимаете,стоит десять вариантов возникновения непонимания.Но всё-таки давайте попробуем...(Э.Уэллс)
Скобочки для templates
От: x-code  
Дата: 04.09.11 16:28
Оценка:
Наткнулся на эту тему
Автор: IROV..
Дата: 02.09.11
, задумался, потом вспомнил про эту
Автор: VladD2
Дата: 14.12.09
, прочитал все по несколько раз Но так и не понял до конца, в чем там фишка.

На самом деле самому интересно, в том числе с точки зрения собственного разрабатываемого языка программирования. Какие неоднозначности возникают в связи с тем, что для угловых скобок, операторов больше меньше и сдвигов используются одни и те же символы?

С одной стороны, в С,С++,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);


Преимущества: везде используются родные угловые скобочки, мозг ломать не надо. И дополнительный спецсимвол вроде как(???) снимает неоднозначности.
Что думаете?
Re: Скобочки для templates
От: vsb Казахстан  
Дата: 04.09.11 17:04
Оценка:
Здравствуйте, x-code, Вы писали:

XC>Наткнулся на эту тему
Автор: IROV..
Дата: 02.09.11
, задумался, потом вспомнил про эту
Автор: VladD2
Дата: 14.12.09
, прочитал все по несколько раз Но так и не понял до конца, в чем там фишка.


XC>На самом деле самому интересно, в том числе с точки зрения собственного разрабатываемого языка программирования. Какие неоднозначности возникают в связи с тем, что для угловых скобок, операторов больше меньше и сдвигов используются одни и те же символы?


XC>С одной стороны, в С,С++,Java,C#,Delphi — т.е. в основных языках, используются <>. Поэтому в любом новом языке хорошо бы оставить именно <>. С другой стороны, ясно что неоднозначности есть и наверняка они будут мешать. Подумал и придумал свой вариант.


XC>Преимущества: везде используются родные угловые скобочки, мозг ломать не надо. И дополнительный спецсимвол вроде как(???) снимает неоднозначности.

XC>Что думаете?

Мне нравится подход Scala — для шаблонов используются угловые скобки. Для адресации массивов используются круглые скобки. Впрочем это наверное не очень традиционно, но читаемость хорошая.
Re[2]: Скобочки для templates
От: x-code  
Дата: 04.09.11 18:11
Оценка:
Здравствуйте, Centaur, Вы писали:

C>В наш унокодный век можно уже использовать в синтаксисе языков всё великое множество скобок и кавычек. () [] {} "" '' “” ‘’ «» ⁅⁆ 〈〉 《》 「」 『』 【】 〔〕 〖〗 〘〙 〚〛


что это за квадратики?
Re[2]: Скобочки для templates
От: Xenon-54  
Дата: 04.09.11 18:13
Оценка:
Здравствуйте, Centaur, Вы писали:

C>Здравствуйте, x-code, Вы писали:


XC>>В объявлении шаблонов оставить все как есть, обычные угловые скобки

XC>>При создании объектов вроде достаточно добавить какой-нибудь символ, и все, неопределенностей нет.
XC>>например ! как в Ди.

C>В наш унокодный век можно уже использовать в синтаксисе языков всё великое множество скобок и кавычек. () [] {} "" '' “” ‘’ «» ⁅⁆ 〈〉 《》 「」 『』 【】 〔〕 〖〗 〘〙 〚〛
Re[2]: Скобочки для templates
От: hardcase Пират http://nemerle.org
Дата: 04.09.11 20:20
Оценка:
Здравствуйте, Centaur, Вы писали:

C>Здравствуйте, x-code, Вы писали:


XC>>В объявлении шаблонов оставить все как есть, обычные угловые скобки

XC>>При создании объектов вроде достаточно добавить какой-нибудь символ, и все, неопределенностей нет.
XC>>например ! как в Ди.

C>В наш унокодный век можно уже использовать в синтаксисе языков всё великое множество скобок и кавычек. () [] {} "" '' “” ‘’ «» ⁅⁆ 〈〉 《》 「」 『』 【】 〔〕 〖〗 〘〙 〚〛


Тяжко набирать
/* иЗвиНите зА неРовнЫй поЧерК */
Re[3]: Скобочки для templates
От: Centaur Россия  
Дата: 05.09.11 01:43
Оценка:
Здравствуйте, hardcase, Вы писали:

C>>В наш уникодный век можно уже использовать в синтаксисе языков всё великое множество скобок и кавычек. () [] {} "" '' “” ‘’ «» ⁅⁆ 〈〉 《》 「」 『』 【】 〔〕 〖〗 〘〙 〚〛


H>Тяжко набирать


Редакторы клавиатурных раскладок есть под все распространённые платформы.
Re: Скобочки для templates
От: Sinix  
Дата: 05.09.11 02:01
Оценка:
Здравствуйте, x-code, Вы писали:

XC>Преимущества: везде используются родные угловые скобочки, мозг ломать не надо. И дополнительный спецсимвол вроде как(???) снимает неоднозначности.

XC>Что думаете?

Что надо быть последовательным. Или используем токен '!<' и в объявлении, и в использовании шаблона, или (лично я за этот вариант) не расширяем синтаксис ради поддержки некрасивого кода.
Re[2]: Скобочки для templates
От: x-code  
Дата: 05.09.11 05:05
Оценка:
Здравствуйте, Sinix, Вы писали:

S>Что надо быть последовательным. Или используем токен '!<' и в объявлении, и в использовании шаблона, или (лично я за этот вариант) не расширяем синтаксис ради поддержки некрасивого кода.


Ну можно и в объявлении. Вопрос-то был в том, решает ли такое расширение проблемы неоднозначностей, которые есть в С++/C#?
Re[3]: Скобочки для templates
От: Sinix  
Дата: 05.09.11 05:12
Оценка:
Здравствуйте, x-code, Вы писали:


XC>Ну можно и в объявлении. Вопрос-то был в том, решает ли такое расширение проблемы неоднозначностей, которые есть в С++/C#?

Для шарпа — решает, но я бы подождал nikov-а Толку правда 0 — в c# оно всплывёт хорошо если раз в 10 лет.
Re[4]: Скобочки для templates
От: x-code  
Дата: 05.09.11 05:47
Оценка:
Здравствуйте, samius, Вы писали:

S>Но насчет остального — по-моему надо и перед закрывающей скобкой неоднозначность убирать.

S>foo!<A > B > x;

А смысл? Насколько часто в параметры шаблонов пихают операторы сравнения? Я в реальном коде ни разу не видел
Поэтому достаточно так.
foo!< (A>B) > x;

Ведь никого же не смущает, что у умножения приоритет больше чем у сложения? Вот и здесь будет правило — приоритет операторов сравнения больше чем у шаблонных скобок. А символ '!' фактически меняет этот приоритет "локально". т.е. если попадаются два токена ! и вслед за ним < — то следующий токен '>' на этом скобочном уровне будет "закрывающая угловая скобка", а не "больше".
Т.е. это не часть оператора <>, а что-то вроде аналога ключевого слова template в примере
Автор: IROV..
Дата: 02.09.11
.
Если же ввести еще символ, то получатся фактически двухсимвольные скобки, против чего выступало большинство в том обсуждении. Не знаю почему, то форма с дополнительным символом воспринимается гораздо легче, чем тяжеловесные двойные скобки (хотя казалось бы — тут три символа, там четыре, вроде не особо большая разница).
Re[5]: Скобочки для templates
От: samius Япония http://sams-tricks.blogspot.com
Дата: 05.09.11 05:55
Оценка:
Здравствуйте, x-code, Вы писали:

XC>Здравствуйте, samius, Вы писали:


S>>Но насчет остального — по-моему надо и перед закрывающей скобкой неоднозначность убирать.

S>>foo!<A > B > x;

XC>А смысл? Насколько часто в параметры шаблонов пихают операторы сравнения? Я в реальном коде ни разу не видел

XC>Поэтому достаточно так.
XC>foo!< (A>B) > x;
Если разбор имеет доступ к ресолву имен, то достаточно и без "!". А если не имеет доступ, то это означает что может быть путаница с любым дополнительным символом, при наличии возможности вводить пользовательские операторы (вроде !<).
Так что в общем случае дополнительный символ может решить проблемы лишь там, где нет возможности определять операторы с этим символом.

XC>Если же ввести еще символ, то получатся фактически двухсимвольные скобки, против чего выступало большинство в том обсуждении. Не знаю почему, то форма с дополнительным символом воспринимается гораздо легче, чем тяжеловесные двойные скобки (хотя казалось бы — тут три символа, там четыре, вроде не особо большая разница).


То есть стоит задача отличить шаблон от выражения без ресолва имен?
Re[6]: Скобочки для templates
От: x-code  
Дата: 05.09.11 08:32
Оценка:
Здравствуйте, samius, Вы писали:

XC>>Если же ввести еще символ, то получатся фактически двухсимвольные скобки, против чего выступало большинство в том обсуждении. Не знаю почему, то форма с дополнительным символом воспринимается гораздо легче, чем тяжеловесные двойные скобки (хотя казалось бы — тут три символа, там четыре, вроде не особо большая разница).


S>То есть стоит задача отличить шаблон от выражения без ресолва имен?

Думаю, что так было бы удобнее. Хотя на самом деле просто интересно — как удобнее — и с точки зрения написания копилятора, и с точки зрения написания программ на языке.
Re[7]: Скобочки для templates
От: Sinix  
Дата: 05.09.11 08:58
Оценка:
Здравствуйте, x-code, Вы писали:

XC>Думаю, что так было бы удобнее. Хотя на самом деле просто интересно — как удобнее — и с точки зрения написания копилятора, и с точки зрения написания программ на языке.


Лично я — за меньший визуальный шум. Программы читаются куда чаще, чем пишутся и, имхо, заставлять вглядываться в разницу между < и !< такое же преступление, как использовать одинарную точку для обозначения диапазона в индексаторе (я даже не знаю, где я такой изврат видел, но сам факт запомнился).
Re[3]: Скобочки для templates
От: AlexCab LinkedIn
Дата: 05.09.11 10:07
Оценка:
Здравствуйте, hardcase, Вы писали:
C>>В наш унокодный век можно уже использовать в синтаксисе языков всё великое множество скобок и кавычек. () [] {} "" '' “” ‘’ «» ⁅⁆ 〈〉 《》 「」 『』 【】 〔〕 〖〗 〘〙 〚〛
H>Тяжко набирать

Как вариант, можно подменять на юнискобки сразу после ввода, но нужна поддержка со стороны IDE.
То есть например, вводим: class MyGeneric<T>
Автоматически подменяется на: class MyGeneric〈T〉
Между тем,что я думаю,тем,что я хочу сказать,тем,что я,как мне кажется,говорю,и тем,что вы хотите услышать,тем,что как вам кажется,вы слышите,тем,что вы понимаете,стоит десять вариантов возникновения непонимания.Но всё-таки давайте попробуем...(Э.Уэллс)
Re[4]: Скобочки для templates
От: Murom Россия  
Дата: 05.09.11 13:00
Оценка:
Здравствуйте, 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 веке. Нет этого и не надо.
- Eugeny
Re[5]: Скобочки для templates
От: AlexCab LinkedIn
Дата: 05.09.11 13:37
Оценка:
Здравствуйте, Murom, Вы писали:
AC>>Как вариант, можно подменять на юнискобки сразу после ввода, но нужна поддержка со стороны IDE.
M>После чего дампим исходник на простенькую консольку ...

Зачем дампить исходный код на консоль?
Между тем,что я думаю,тем,что я хочу сказать,тем,что я,как мне кажется,говорю,и тем,что вы хотите услышать,тем,что как вам кажется,вы слышите,тем,что вы понимаете,стоит десять вариантов возникновения непонимания.Но всё-таки давайте попробуем...(Э.Уэллс)
Re[4]: Скобочки для templates
От: Sinix  
Дата: 05.09.11 13:43
Оценка:
Здравствуйте, AlexCab, Вы писали:

AC>Автоматически подменяется на: class MyGeneric〈T〉

Тогда уж проще временно подменять прямо в IDE. И вам хорошо, и остальным не мучаться.
Re[5]: Скобочки для templates
От: Centaur Россия  
Дата: 05.09.11 16:25
Оценка:
Здравствуйте, Murom, Вы писали:

M>После чего дампим исходник на простенькую консольку и получаем:


Для несчастных пользователей древних консолек люди придумали ди- и триграфы. А другие умные люди придумали правило никогда их не использовать без абсолютной необходимости.
Re[3]: Скобочки для templates
От: VladD2 Российская Империя www.nemerle.org
Дата: 05.09.11 16:33
Оценка:
Здравствуйте, hardcase, Вы писали:

C>>В наш унокодный век можно уже использовать в синтаксисе языков всё великое множество скобок и кавычек. () [] {} "" '' “” ‘’ «» ⁅⁆ 〈〉 《》 「」 『』 【】 〔〕 〖〗 〘〙 〚〛


H>Тяжко набирать


Да набор — это чисто техническая проблема, а потому решаемая. Достаточно сделать спец-шорткаты.

Намного важнее социальные проблемы. Юникод будет перодически убиваться. Где-то форум юникод не поддерживает, где-то человек лохонулся.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[3]: Скобочки для templates
От: VladD2 Российская Империя www.nemerle.org
Дата: 05.09.11 16:41
Оценка:
Здравствуйте, 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.


Если в условиях языка с фиксированным синтаксисом это еще приемлемо (хотя и вызывает проблемы), то в условиях языка с расширяемым синтаксисом — это практически не приемлемо.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re: Скобочки для templates
От: x-code  
Дата: 17.02.12 10:16
Оценка:
Обдумывал недавно "идеальную" систему метапрограммирования, достаточно простую и в то же время мощную, способную заменить препроцессор (#define), и объединяющую шаблоны в стиле С++ и макросы в стиле Nemerle. И в частности возникла мысль: а почему в шаблонах не используются обычные круглые скобки? Только из соображений общей перегруженности круглых скобок другими функциями? Или есть какие-то особые причины?
Re[2]: Скобочки для templates
От: FR  
Дата: 17.02.12 10:36
Оценка:
Здравствуйте, x-code, Вы писали:

XC>Обдумывал недавно "идеальную" систему метапрограммирования, достаточно простую и в то же время мощную, способную заменить препроцессор (#define), и объединяющую шаблоны в стиле С++ и макросы в стиле Nemerle. И в частности возникла мысль: а почему в шаблонах не используются обычные круглые скобки? Только из соображений общей перегруженности круглых скобок другими функциями? Или есть какие-то особые причины?


Используются, например в D
http://www.d-programming-language.org/templates-revisited.html
http://www.d-programming-language.org/template.html

По моему получилось лучше чем с угловыми, особенно для функций:

T Square(T)(T t) {
  return t * t;
}
Re[2]: Скобочки для templates
От: PSV100  
Дата: 17.02.12 15:48
Оценка:
Здравствуйте, x-code, Вы писали:

XC>Обдумывал недавно "идеальную" систему метапрограммирования, достаточно простую и в то же время мощную, способную заменить препроцессор (#define), и объединяющую шаблоны в стиле С++ и макросы в стиле Nemerle. И в частности возникла мысль: а почему в шаблонах не используются обычные круглые скобки? Только из соображений общей перегруженности круглых скобок другими функциями? Или есть какие-то особые причины?


Сугубо мне лично скаловские квадратные скобки воспринимаются легче, чем плюсовые угловые. Приведенные рядом круглые скобки из D — ещё лучше, и ключевой момент здесь — единство стиля. В этом плане здорово сделано в Хаскеле — объявление и вызов функций, декларация типов и конструкторов данных — выглядит всё похоже, для параметров вообще нет никаких скобок (ну кроме туплов, выделения вычислений и пр.). Хотя в хаскеле иногда в коде не хватает скобок при вызове функций — так иногда проще разобраться. А в языках всякие угловые скобки и прочие спецсимволы всё-таки создают левый шум. Например, можно в редакторе одновременно попереключаться с кода на код: С++ -> Go (по синтаксису близкий к С, но с меньшей кашей, чем С++) -> Lua (чем-то напоминающий Go, здесь есть местами и {}, но ещё меньше шума — нет всяких указателей и взятий адресов, звёздочка только как оператор). Вполне чувствуется разница.

А в рамках "идеальной" системы метапрограммирования для императивного языка я для себя пришёл к выводу, что это должен быть язык с синтаксисом на базе Go и Lua, с простыми элементами функциональщины из таких язычков как CoffeeScript и ему подобный MoonScript (возможно, задействовать и принцип отступов), без ОПП и с концепциями похожими на интерфейсы в Go или классы типов в хаскеле или типы и протоколы в кложуре. А мета-система — в стиле MetaLua, но со статическим контролем типов во время компиляции, при этом расширение синтаксиса базового языка — под большим вопросом. Язык должен позволять некий fluent DSL, как, например, такие фишки в груви как концепция билдеров, Command chains (очень красиво и просто), GPath и т.п., т.е. всё в рамках основного простого (!!!) языка. А метапрограммирование должно выполнять вычесления на этапе компиляции, со всеми большими возможностями, доступные платформе, вплоть до парсинга внешних файлов, чтение данных из СУБД и пр., и помогать контролируемо генерировать основной код, т.е. где-то неявно добавить функции, структуры, переменные, сам вычислительный код и т.д. и т.п.
В какой-то мере — это путь к лиспу, но с более человеко-читаемым синтаксисом.

Сорри за небольшой офтоп, просто у самого сейчас в голове летают мысли по поводу своего язычка-DSL.
Re: Скобочки для templates
От: sgrape Россия  
Дата: 17.02.12 17:12
Оценка:
Здравствуйте, 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);


В таком синтаксисе возможны некоторые нюансы, но вроде ничего принципиально неразрешимого нет.
Re[2]: Скобочки для templates
От: x-code  
Дата: 17.02.12 19:32
Оценка:
Здравствуйте, 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 языка, то есть и константы, и типы, и функции, и выражения, и даже блоки кода. То, что это почему-то не реализовано в известных языках — другой вопрос.

На самом деле я пришел к выводу, действительно от угловых скобок стоит отказаться и перейти к круглым со спецсимволом перед ними для чисто визуальной красоты. Как в Ди.
Re[3]: Скобочки для templates
От: PSV100  
Дата: 17.02.12 23:47
Оценка:
Здравствуйте, 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-паскале-подобный способ записи типов, т.е. справа, и без лишней шелухи, тех же двоеточий.
Re[3]: Скобочки для templates
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 18.02.12 00:47
Оценка:
Здравствуйте, x-code, Вы писали:

XC>Шаблоны — это по сути "квазицитаты", и когда вы передаете в шаблон какой-то параметр, вы инициируете подстановку одного фрагмента AST — параметра — в другой — сам шаблон


В случае С#, примеры на котором были приведены, никакой подстановки AST в шаблон не производится.
... << RSDN@Home 1.2.0 alpha 5 rev. 21 on Windows 7 6.1.7601.65536>>
AVK Blog
Re[4]: Скобочки для templates
От: PSV100  
Дата: 18.02.12 10:15
Оценка:
Здравствуйте, PSV100, Вы писали:

XC>>Есть. Параметры шаблонов и параметры функций — это совершенно разные сущности, приводящие к совершенно разным последствиям в процессе компиляции. Шаблоны — это по сути "квазицитаты", и когда вы передаете в шаблон какой-то параметр, вы инициируете подстановку одного фрагмента AST — параметра — в другой — сам шаблон, это дополнительная операция, совершенно не имеющая никакого отношения к передаче параметров в функцию. Не забывайте, что кроме типов, параметрами шаблонов в общем случае может быть что угодно — на самом деле любой корректный фрагмент AST языка, то есть и константы, и типы, и функции, и выражения, и даже блоки кода. То, что это почему-то не реализовано в известных языках — другой вопрос.


В дополнение. Имхо, в шаблонах лучше кроме типов больше ничего и не иметь, т.е. гараздо проще, лучше и безопаснее иметь простую полиморфную систему. То, что в С++ пытаются метапрограммировать через шаблоны — это костыль костылём погоняет, использование инструмента не по назначению, и это вынужденная мера, т.к. альтернативы нет, а потребность есть. Но если делать какую-то систему для себя, зачем искусственно себя костылить? Имхо, весьма приятнее простой параметрический полиморфизм плюс наколенный Немерл, например, по мотивам принципов и синтаксиса (!) MetaLua — одна из более-менее человечных систем в этом классе.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.