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...
Пока на собственное сообщение не было ответов, его можно удалить.