, прочитал все по несколько раз Но так и не понял до конца, в чем там фишка.
На самом деле самому интересно, в том числе с точки зрения собственного разрабатываемого языка программирования. Какие неоднозначности возникают в связи с тем, что для угловых скобок, операторов больше меньше и сдвигов используются одни и те же символы?
С одной стороны, в С,С++,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 — для шаблонов используются угловые скобки. Для адресации массивов используются круглые скобки. Впрочем это наверное не очень традиционно, но читаемость хорошая.
Здравствуйте, x-code, Вы писали:
XC>В объявлении шаблонов оставить все как есть, обычные угловые скобки XC>При создании объектов вроде достаточно добавить какой-нибудь символ, и все, неопределенностей нет. XC>например ! как в Ди.
В наш унокодный век можно уже использовать в синтаксисе языков всё великое множество скобок и кавычек. () [] {} "" '' “” ‘’ «» ⁅⁆ 〈〉 《》 「」 『』 【】 〔〕 〖〗 〘〙 〚〛
Здравствуйте, 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 лет.
Здравствуйте, x-code, Вы писали:
XC>Здравствуйте, Sinix, Вы писали:
S>>Что надо быть последовательным. Или используем токен '!<' и в объявлении, и в использовании шаблона, или (лично я за этот вариант) не расширяем синтаксис ради поддержки некрасивого кода.
XC>Ну можно и в объявлении. Вопрос-то был в том, решает ли такое расширение проблемы неоднозначностей, которые есть в С++/C#?
в C# выражения в параметрах жаблона недопустимы, на сколько я знаю.
Но насчет остального — по-моему надо и перед закрывающей скобкой неоднозначность убирать.
foo!<A > B > x;
Здравствуйте, 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. И вам хорошо, и остальным не мучаться.
Здравствуйте, Sinix, Вы писали: AC>>Автоматически подменяется на: class MyGeneric〈T〉 S>Тогда уж проще временно подменять прямо в IDE. И вам хорошо, и остальным не мучаться.
Почему бы и нет.
Между тем,что я думаю,тем,что я хочу сказать,тем,что я,как мне кажется,говорю,и тем,что вы хотите услышать,тем,что как вам кажется,вы слышите,тем,что вы понимаете,стоит десять вариантов возникновения непонимания.Но всё-таки давайте попробуем...(Э.Уэллс)