AVK Selected
Показавшиеся интересными, на мой вкус, посты
PM in C#
07.08.2014
|
IB |
Draft spec for records and pattern-matching in C#
https://roslyn.codeplex.com/discussions/560339
https://roslyn.codeplex.com/discussions/560339
07.08.2014 30 комментариев |
Т.е. может еще 100 раз поменяться?
Q>Т.е. может еще 100 раз поменяться?
Да хоть 1000, главное что они начали уже что-то делать в этом направлении, а не рассказывать, что PM — это не OOP.
IB>Да хоть 1000, главное что они начали уже что-то делать в этом направлении, а не рассказывать, что PM — это не OOP.
Всего-то прошло 8 лет. Поздравляем. Правда драфт уродский конечно, но раз уж начали делать, сделают нормально
G>Всего-то прошло 8 лет. Поздравляем. Правда драфт уродский конечно, но раз уж начали делать, сделают нормально
Помнишь, года 3 или 4 назад Мэдс говорил, что PM будет в C# 7.0?
Мужик походу держит слово — уважуха. ))
G>>Всего-то прошло 8 лет. Поздравляем. Правда драфт уродский конечно, но раз уж начали делать, сделают нормально
IB>Помнишь, года 3 или 4 назад Мэдс говорил, что PM будет в C# 7.0?
ЕМНИП 8.0
AVK>ЕМНИП 8.0
Вангую — 9, нет 10.
AVK>ЕМНИП 8.0
Мне запомнилось 7.0, ну не суть... Мы уже и на мозги им капать устали, и тут на тебе =)
IB>Мне запомнилось 7.0, ну не суть... Мы уже и на мозги им капать устали, и тут на тебе =)
Ну, ников тут уже про это писал. Но посмотреть реальный драфт было, конечно, интересно, хоть он и сырой дюже.
Q>>Т.е. может еще 100 раз поменяться?
IB>Да хоть 1000, главное что они начали уже что-то делать в этом направлении, а не рассказывать, что PM — это не OOP.
Как и говорили
большевикивлады 8 лет назад, МС созреет лет через 10. Ну, чё? Они превзашли сами себя и созрели аж на 2 года раньше. Хотя еще два года будут согласовывать и отлаживать.Реализация то экспериментальная есть? Или только драфт?
VD>Реализация то экспериментальная есть? Или только драфт?
Пока только черновик драфта.
IB>Draft spec for records and pattern-matching in C#
IB>https://roslyn.codeplex.com/discussions/560339
Пипец.
J>Пипец.
В чем пипец? Шаблон порвало?
VD>Здравствуйте, Jack128, Вы писали:
J>>Пипец.
VD>В чем пипец? Шаблон порвало?
ну типа да. в огромном кол-ве случаев вместо switch придется цепочку if (... is ) писать
J>ну типа да. в огромном кол-ве случаев вместо switch придется цепочку if (... is ) писать
Не понял. switch же поддерживается .
Что не так?
Единственная проблема, которую я вижу — это то что и if, и switch — это стетменты, так что в контексте выражения их не по используешь.
VD>Единственная проблема, которую я вижу — это то что и if, и switch — это стетменты, так что в контексте выражения их не по используешь.
А чем тебе тернарный оператор не if-expression?
Q>А чем тебе тернарный оператор не if-expression?
А в нем будет поддерживаться ПМ?
VD>Здравствуйте, Qbit86, Вы писали:
Q>>А чем тебе тернарный оператор не if-expression?
VD>А в нем будет поддерживаться ПМ?
Актуальный вопрос.
Такой синтаксис хоть и противоестественен, но более нагляден и удобен чем предлагаемый сейчас switch, и больше похож на PM. Очевидная проблема здесь — область видимости пробрасываемых с помощью is переменных.
VD>Здравствуйте, Jack128, Вы писали:
J>>ну типа да. в огромном кол-ве случаев вместо switch придется цепочку if (... is ) писать
VD>Не понял. switch же поддерживается .
Пример:
switch (obj) {
case Cat("Slats"): ...
case Cat(var name): ...
case Animal(var species): ...
}
пусть obj = new Cat("Slat")
Так порядок проверки условий в switch неопределён, то компилятор вполне может сначала проверить паттерн Cat(var name). obj вполне подходит под этот паттерн, значит будем выполнять соответсвующую ветку case. Несколько нелогичное поведение ИМХО. Понятно, что компилятор может просто отказаться компилировать такой код, тогда нужно будет цепочку if'ов писать.
J>Так порядок проверки условий в switch неопределён, то компилятор вполне может сначала проверить паттерн Cat(var name).
J>
Из цитаты, я так понял, выбирается таки первый из соответствующих паттернов. Просто сгенерированный компилятором код, который проверяет соответствие, будет исполняться в неопределенном порядке. Это может ускорить процесс выбора (допустим, компилятор сможет сначала проверить объект на базовый тип, и отбросить все case-ы с базовым и отнаследованными типами).
IB>Draft spec for records and pattern-matching in C#
IB>https://roslyn.codeplex.com/discussions/560339
Сходу нашел косяк. Для связывания переменных нужно использовать не var, а let, чтобы не делать переменные изменяемыми. Или будет не ясно как оно работает. Ведь по идее переменная связывается с частью объекта, а значит изменив переменную должна меняться и соответствующая часть объекта.
Еще switch и if — это стейтменты, что не всегда удобно. Нужно заводить аналогичные выражения, чтобы их можно было использовать внутри выражений и рекурсивно.
VD>Здравствуйте, IB, Вы писали:
IB>>Draft spec for records and pattern-matching in C#
IB>>https://roslyn.codeplex.com/discussions/560339
VD>Сходу нашел косяк. Для связывания переменных нужно использовать не var, а let, чтобы не делать переменные изменяемыми. Или будет не ясно как оно работает. Ведь по идее переменная связывается с частью объекта, а значит изменив переменную должна меняться и соответствующая часть объекта.
var не всегда переменная.
VD>Еще switch и if — это стейтменты, что не всегда удобно. Нужно заводить аналогичные выражения, чтобы их можно было использовать внутри выражений и рекурсивно.
+100500
G>var не всегда переменная.
G>
Ну, и что в этом хорошего? Надо было использовать let (один фиг уже применяется), если это не переменная. Это еще один косяк в языке.
VD>Здравствуйте, gandjustas, Вы писали:
G>>var не всегда переменная.
G>>
VD>Ну, и что в этом хорошего? Надо было использовать let (один фиг уже применяется), если это не переменная. Это еще один косяк в языке.
Да как-то никого не волновало и с PM народ тоже жаловаться не будет.
ЗЫ. У меня вообще всегда проблемы были с языками где let и var — все время путал что для чего и где писать.
G>Да как-то никого не волновало и с PM народ тоже жаловаться не будет.
Таких обычно и наличие ПМ не волнует.
G>ЗЫ. У меня вообще всегда проблемы были с языками где let и var — все время путал что для чего и где писать.
Вроде все просто let — связывание имени (аналог неизменяемой переменной), var — объявление изменяемой переменной.
VD>Здравствуйте, gandjustas, Вы писали:
G>>Да как-то никого не волновало и с PM народ тоже жаловаться не будет.
VD>Таких обычно и наличие ПМ не волнует.
C# все таки рассчитан на массового потребителя.
G>>ЗЫ. У меня вообще всегда проблемы были с языками где let и var — все время путал что для чего и где писать.
VD>Вроде все просто let — связывание имени (аналог неизменяемой переменной), var — объявление изменяемой переменной.
Ага, а потом думай что нужно использовать в for, foreach, switch, а когда появится разделение на let и var начнется путаница в linq. Имхо лучше вообще не вводить дополнительных ключевых слов, особенно для объявления переменных.
G>C# все таки рассчитан на массового потребителя.
А все то остальные создатели языков рассчитывали на то, что ими они сами будут пользоваться или элитарный круг избранных.
Что за чушь?
VD>>Вроде все просто let — связывание имени (аналог неизменяемой переменной), var — объявление изменяемой переменной.
G>Ага, а потом думай что нужно использовать в for, foreach, switch, а когда появится разделение на let и var начнется путаница в linq. Имхо лучше вообще не вводить дополнительных ключевых слов, особенно для объявления переменных.
А массовый потребитель думать не приучен? Это так сложно, думать перед действиями?
Что мы делаем в for? Меняем значение переменной. Значит ничего кроме var там быть не может. В foreach вообще можно было бы без var обойтись. В switch (т.е. в паттерн-матчинге) идет связывание имени с частью объекта. Зачем там var?
IB>Draft spec for records and pattern-matching in C#
IB>https://roslyn.codeplex.com/discussions/560339
Тут все еще много открытых вопросов.
Неясно будут ли 'guard'-ы на сопоставление образца.
Также насколько я понимаю невозможно создавать переменные при сопоставлении образца: (Nemerle):
Из документа я не совсем понял можно ли привязывать переменные с сопоставлением.
Т.е. можно просто case Mult(Const(1), var x): return Simplify(x); , а более сложно видимо нельзя ?
С нетерпением ждем улучшения условий жизни программиста