PM in C#
От: IB Австрия http://rsdn.ru
Дата: 07.08.14 17:42
Оценка: 366 (16)
Draft spec for records and pattern-matching in C#
https://roslyn.codeplex.com/discussions/560339
Мы уже победили, просто это еще не так заметно...
Re[2]: PM in C#
От: IB Австрия http://rsdn.ru
Дата: 08.08.14 08:35
Оценка: 9 (1) +2
Здравствуйте, Qodomoc, Вы писали:

Q>Т.е. может еще 100 раз поменяться?

Да хоть 1000, главное что они начали уже что-то делать в этом направлении, а не рассказывать, что PM — это не OOP.
Мы уже победили, просто это еще не так заметно...
Re[4]: PM in C#
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 08.08.14 15:21
Оценка: +3
Здравствуйте, VladD2, Вы писали:

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


G>>var не всегда переменная.

G>>
G>>foreach(var o in new object[0])
G>>{
G>>    o = new object(); //Не компилируется
G>>}
G>>


VD>Ну, и что в этом хорошего? Надо было использовать let (один фиг уже применяется), если это не переменная. Это еще один косяк в языке.


Да как-то никого не волновало и с PM народ тоже жаловаться не будет.

ЗЫ. У меня вообще всегда проблемы были с языками где let и var — все время путал что для чего и где писать.
Re: Первая реализация
От: IB Австрия http://rsdn.ru
Дата: 25.08.14 08:13
Оценка: 33 (2)
Ветка Roslyn с экспериментальной поддержкой record и pattern matching: https://roslyn.codeplex.com/SourceControl/changeset/00552fc2287f820ae9d42fd259aa6c07c2c5a805
Мы уже победили, просто это еще не так заметно...
Re[4]: PM in C#
От: IB Австрия http://rsdn.ru
Дата: 08.08.14 08:41
Оценка: 18 (2)
Здравствуйте, Gollum, Вы писали:

G>Всего-то прошло 8 лет. Поздравляем. Правда драфт уродский конечно, но раз уж начали делать, сделают нормально

Помнишь, года 3 или 4 назад Мэдс говорил, что PM будет в C# 7.0?
Мужик походу держит слово — уважуха. ))
Мы уже победили, просто это еще не так заметно...
Re[8]: If-expression
От: VladD2 Российская Империя www.nemerle.org
Дата: 13.08.14 20:27
Оценка: +2
Здравствуйте, Крякозавр, Вы писали:

К>Такой синтаксис хоть и противоестественен, но более нагляден и удобен чем предлагаемый сейчас switch, и больше похож на PM. Очевидная проблема здесь — область видимости пробрасываемых с помощью is переменных.


Нужно не париться, а завести специальный оператор. В Nemerle и F# — это оператор match. Можно и в C# аналогичныый оператор ввести. Будет он доступен в контексте выражения. За одно и от всех проблем вроде необходимости break-ов избавятся.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[3]: PM in C#
От: Gollum Россия  
Дата: 08.08.14 08:39
Оценка: 18 (1)
Здравствуйте, IB, Вы писали:

IB>Да хоть 1000, главное что они начали уже что-то делать в этом направлении, а не рассказывать, что PM — это не OOP.


Всего-то прошло 8 лет. Поздравляем. Правда драфт уродский конечно, но раз уж начали делать, сделают нормально
Eugene Agafonov on the .NET

Re: PM in C#
От: Jack128  
Дата: 08.08.14 08:45
Оценка: +1
Здравствуйте, IB, Вы писали:

IB>Draft spec for records and pattern-matching in C#

IB>https://roslyn.codeplex.com/discussions/560339


I noticed in the switch proposal "The order in which patterns are matched is not defined." It would be useful if the order were defined (as in F#) so that we could write more precise patterns before more general patterns:
// assume Cat derives from Animal
switch (obj) {
case Cat("Slats"): ...
case Cat(var name): ...
case Animal(var species): ...
}
Lack of defined ordering would require me to write the Cat logic within the Animal case, as I couldn't be sure that the Cat cases would be checked first. It would also create versioning woes if I got lucky initially, then took a service pack of the framework which subtly changed the compilation strategy in a way which resulted in a different order of matching.





nmgafter
Developer
Today at 1:50 AM
itowlson wrote:

>>>>I noticed in the switch proposal "The order in which patterns are matched is not defined." It would be useful if the order were defined (as in F#) so that we could write more precise patterns before more general patterns:


The semantics of the switch statement is that the first matched pattern is the one selected. What is not specified is the order in which the match operators are executed.


Пипец.
Re[8]: PM in C#
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 08.08.14 21:23
Оценка: :)
Здравствуйте, VladD2, Вы писали:

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


G>>C# все таки рассчитан на массового потребителя.


VD>А все то остальные создатели языков рассчитывали на то, что ими они сами будут пользоваться или элитарный круг избранных.


VD>Что за чушь?


Судя по nemerle так и есть

VD>>>Вроде все просто let — связывание имени (аналог неизменяемой переменной), var — объявление изменяемой переменной.


G>>Ага, а потом думай что нужно использовать в for, foreach, switch, а когда появится разделение на let и var начнется путаница в linq. Имхо лучше вообще не вводить дополнительных ключевых слов, особенно для объявления переменных.


VD>А массовый потребитель думать не приучен? Это так сложно, думать перед действиями?


Не приручен, думание снижает продуктивность и повышает порог вхождения. Так что лучше var. Тем более на примере foreach это никаких проблем не принесло.

VD>Что мы делаем в for? Меняем значение переменной. Значит ничего кроме var там быть не может. В foreach вообще можно было бы без var обойтись. В switch (т.е. в паттерн-матчинге) идет связывание имени с частью объекта. Зачем там var?

В foreach такое же связывание и нормально с var.
Re[6]: PM in C#
От: catbert  
Дата: 10.08.14 18:39
Оценка: +1
Здравствуйте, Jack128, Вы писали:

J>Так порядок проверки условий в switch неопределён, то компилятор вполне может сначала проверить паттерн Cat(var name).


J>

J>The semantics of the switch statement is that the first matched pattern is the one selected.


Из цитаты, я так понял, выбирается таки первый из соответствующих паттернов. Просто сгенерированный компилятором код, который проверяет соответствие, будет исполняться в неопределенном порядке. Это может ускорить процесс выбора (допустим, компилятор сможет сначала проверить объект на базовый тип, и отбросить все case-ы с базовым и отнаследованными типами).
Re: PM in C#
От: Qodomoc Россия  
Дата: 07.08.14 20:01
Оценка:

This is an experimental language feature that has not yet been vetted by the C# language design group. The prototype is intended to help prepare for such a discussion.


Т.е. может еще 100 раз поменяться?
Re[5]: PM in C#
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 08.08.14 11:49
Оценка:
Здравствуйте, IB, Вы писали:

G>>Всего-то прошло 8 лет. Поздравляем. Правда драфт уродский конечно, но раз уж начали делать, сделают нормально

IB>Помнишь, года 3 или 4 назад Мэдс говорил, что PM будет в C# 7.0?

ЕМНИП 8.0
... << RSDN@Home 1.2.0 alpha 5 rev. 100 on Windows 8 6.2.9200.0>>
AVK Blog
Re[3]: PM in C#
От: VladD2 Российская Империя www.nemerle.org
Дата: 08.08.14 13:32
Оценка:
Здравствуйте, IB, Вы писали:

Q>>Т.е. может еще 100 раз поменяться?

IB>Да хоть 1000, главное что они начали уже что-то делать в этом направлении, а не рассказывать, что PM — это не OOP.

Как и говорили большевики влады 8 лет назад, МС созреет лет через 10. Ну, чё? Они превзашли сами себя и созрели аж на 2 года раньше. Хотя еще два года будут согласовывать и отлаживать.

Реализация то экспериментальная есть? Или только драфт?
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re: PM in C#
От: VladD2 Российская Империя www.nemerle.org
Дата: 08.08.14 13:34
Оценка:
Здравствуйте, IB, Вы писали:

IB>Draft spec for records and pattern-matching in C#

IB>https://roslyn.codeplex.com/discussions/560339

Сходу нашел косяк. Для связывания переменных нужно использовать не var, а let, чтобы не делать переменные изменяемыми. Или будет не ясно как оно работает. Ведь по идее переменная связывается с частью объекта, а значит изменив переменную должна меняться и соответствующая часть объекта.

Еще switch и if — это стейтменты, что не всегда удобно. Нужно заводить аналогичные выражения, чтобы их можно было использовать внутри выражений и рекурсивно.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[2]: PM in C#
От: VladD2 Российская Империя www.nemerle.org
Дата: 08.08.14 13:36
Оценка:
Здравствуйте, Jack128, Вы писали:

J>Пипец.


В чем пипец? Шаблон порвало?
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[6]: PM in C#
От: VladD2 Российская Империя www.nemerle.org
Дата: 08.08.14 13:36
Оценка:
Здравствуйте, AndrewVK, Вы писали:

AVK>ЕМНИП 8.0


Вангую — 9, нет 10.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[2]: PM in C#
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 08.08.14 14:34
Оценка:
Здравствуйте, VladD2, Вы писали:

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


IB>>Draft spec for records and pattern-matching in C#

IB>>https://roslyn.codeplex.com/discussions/560339

VD>Сходу нашел косяк. Для связывания переменных нужно использовать не var, а let, чтобы не делать переменные изменяемыми. Или будет не ясно как оно работает. Ведь по идее переменная связывается с частью объекта, а значит изменив переменную должна меняться и соответствующая часть объекта.


var не всегда переменная.
foreach(var o in new object[0])
{
    o = new object(); //Не компилируется
}



VD>Еще switch и if — это стейтменты, что не всегда удобно. Нужно заводить аналогичные выражения, чтобы их можно было использовать внутри выражений и рекурсивно.


+100500
Re[3]: PM in C#
От: VladD2 Российская Империя www.nemerle.org
Дата: 08.08.14 14:48
Оценка:
Здравствуйте, gandjustas, Вы писали:

G>var не всегда переменная.

G>
G>foreach(var o in new object[0])
G>{
G>    o = new object(); //Не компилируется
G>}
G>


Ну, и что в этом хорошего? Надо было использовать let (один фиг уже применяется), если это не переменная. Это еще один косяк в языке.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[6]: PM in C#
От: IB Австрия http://rsdn.ru
Дата: 08.08.14 14:56
Оценка:
Здравствуйте, AndrewVK, Вы писали:

AVK>ЕМНИП 8.0

Мне запомнилось 7.0, ну не суть... Мы уже и на мозги им капать устали, и тут на тебе =)
Мы уже победили, просто это еще не так заметно...
Re[4]: PM in C#
От: IB Австрия http://rsdn.ru
Дата: 08.08.14 14:57
Оценка:
Здравствуйте, VladD2, Вы писали:


VD>Реализация то экспериментальная есть? Или только драфт?

Пока только черновик драфта.
Мы уже победили, просто это еще не так заметно...
Re[7]: PM in C#
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 08.08.14 16:01
Оценка:
Здравствуйте, IB, Вы писали:

IB>Мне запомнилось 7.0, ну не суть... Мы уже и на мозги им капать устали, и тут на тебе =)


Ну, ников тут уже про это писал. Но посмотреть реальный драфт было, конечно, интересно, хоть он и сырой дюже.
... << RSDN@Home 1.2.0 alpha 5 rev. 100 on Windows 8 6.2.9200.0>>
AVK Blog
Re[3]: PM in C#
От: Jack128  
Дата: 08.08.14 16:17
Оценка:
Здравствуйте, VladD2, Вы писали:

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


J>>Пипец.


VD>В чем пипец? Шаблон порвало?


ну типа да. в огромном кол-ве случаев вместо switch придется цепочку if (... is ) писать
Re[5]: PM in C#
От: VladD2 Российская Империя www.nemerle.org
Дата: 08.08.14 18:34
Оценка:
Здравствуйте, gandjustas, Вы писали:

G>Да как-то никого не волновало и с PM народ тоже жаловаться не будет.


Таких обычно и наличие ПМ не волнует.

G>ЗЫ. У меня вообще всегда проблемы были с языками где let и var — все время путал что для чего и где писать.


Вроде все просто let — связывание имени (аналог неизменяемой переменной), var — объявление изменяемой переменной.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[4]: PM in C#
От: VladD2 Российская Империя www.nemerle.org
Дата: 08.08.14 18:37
Оценка:
Здравствуйте, Jack128, Вы писали:

J>ну типа да. в огромном кол-ве случаев вместо switch придется цепочку if (... is ) писать


Не понял. switch же поддерживается .

Что не так?

Единственная проблема, которую я вижу — это то что и if, и switch — это стетменты, так что в контексте выражения их не по используешь.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[6]: PM in C#
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 08.08.14 19:13
Оценка:
Здравствуйте, VladD2, Вы писали:

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


G>>Да как-то никого не волновало и с PM народ тоже жаловаться не будет.


VD>Таких обычно и наличие ПМ не волнует.


C# все таки рассчитан на массового потребителя.

G>>ЗЫ. У меня вообще всегда проблемы были с языками где let и var — все время путал что для чего и где писать.


VD>Вроде все просто let — связывание имени (аналог неизменяемой переменной), var — объявление изменяемой переменной.


Ага, а потом думай что нужно использовать в for, foreach, switch, а когда появится разделение на let и var начнется путаница в linq. Имхо лучше вообще не вводить дополнительных ключевых слов, особенно для объявления переменных.
Re[7]: PM in C#
От: VladD2 Российская Империя www.nemerle.org
Дата: 08.08.14 19:20
Оценка:
Здравствуйте, gandjustas, Вы писали:

G>C# все таки рассчитан на массового потребителя.


А все то остальные создатели языков рассчитывали на то, что ими они сами будут пользоваться или элитарный круг избранных.

Что за чушь?

VD>>Вроде все просто let — связывание имени (аналог неизменяемой переменной), var — объявление изменяемой переменной.


G>Ага, а потом думай что нужно использовать в for, foreach, switch, а когда появится разделение на let и var начнется путаница в linq. Имхо лучше вообще не вводить дополнительных ключевых слов, особенно для объявления переменных.


А массовый потребитель думать не приучен? Это так сложно, думать перед действиями?

Что мы делаем в for? Меняем значение переменной. Значит ничего кроме var там быть не может. В foreach вообще можно было бы без var обойтись. В switch (т.е. в паттерн-матчинге) идет связывание имени с частью объекта. Зачем там var?
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[5]: If-expression
От: Qbit86 Кипр
Дата: 08.08.14 20:25
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Единственная проблема, которую я вижу — это то что и if, и switch — это стетменты, так что в контексте выражения их не по используешь.


А чем тебе тернарный оператор не if-expression?
Глаза у меня добрые, но рубашка — смирительная!
Re[6]: If-expression
От: VladD2 Российская Империя www.nemerle.org
Дата: 08.08.14 20:53
Оценка:
Здравствуйте, Qbit86, Вы писали:

Q>А чем тебе тернарный оператор не if-expression?


А в нем будет поддерживаться ПМ?
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[5]: PM in C#
От: Jack128  
Дата: 08.08.14 21:07
Оценка:
Здравствуйте, VladD2, Вы писали:

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


J>>ну типа да. в огромном кол-ве случаев вместо switch придется цепочку if (... is ) писать


VD>Не понял. switch же поддерживается .



I noticed in the switch proposal "The order in which patterns are matched is not defined."


The semantics of the switch statement is that the first matched pattern is the one selected. What is not specified is the order in which the match operators are executed.


Пример:
switch (obj) {
case Cat("Slats"): ...
case Cat(var name): ...
case Animal(var species): ...
}

пусть obj = new Cat("Slat")


Так порядок проверки условий в switch неопределён, то компилятор вполне может сначала проверить паттерн Cat(var name). obj вполне подходит под этот паттерн, значит будем выполнять соответсвующую ветку case. Несколько нелогичное поведение ИМХО. Понятно, что компилятор может просто отказаться компилировать такой код, тогда нужно будет цепочку if'ов писать.
Re[7]: If-expression
От: Крякозавр  
Дата: 13.08.14 08:08
Оценка:
Здравствуйте, VladD2, Вы писали:

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


Q>>А чем тебе тернарный оператор не if-expression?


VD>А в нем будет поддерживаться ПМ?


Актуальный вопрос.
var result = <condition1> ? <result1> : 
         <condition2> ? <result2> :
         <condition3> ? <result3> :
         <default>;

Такой синтаксис хоть и противоестественен, но более нагляден и удобен чем предлагаемый сейчас switch, и больше похож на PM. Очевидная проблема здесь — область видимости пробрасываемых с помощью is переменных.
Re: PM in C#
От: _NN_ www.nemerleweb.com
Дата: 13.08.14 10:38
Оценка:
Здравствуйте, IB, Вы писали:

IB>Draft spec for records and pattern-matching in C#

IB>https://roslyn.codeplex.com/discussions/560339

Тут все еще много открытых вопросов.
Неясно будут ли 'guard'-ы на сопоставление образца.

Также насколько я понимаю невозможно создавать переменные при сопоставлении образца: (Nemerle):
match(a)
{
| A with myVar = 1
| B with myVar = 2 => // using myVar
}


Из документа я не совсем понял можно ли привязывать переменные с сопоставлением.
Т.е. можно просто case Mult(Const(1), var x): return Simplify(x); , а более сложно видимо нельзя ?
match(a)
{
| X(Y(1) as y, Z(_) as z) as x => ...
 // используем x,y,z
}


С нетерпением ждем улучшения условий жизни программиста
http://rsdn.nemerleweb.com
http://nemerleweb.com
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.