Re[2]: Краткий пересказ
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 15.09.05 08:21
Оценка: +1
Здравствуйте, VladD2, Вы писали:

AVK>>1) Неявно типизированные локальные переменные (implicitly typed local variable). То о чем долго говорили большевики в форуме философия. Даже ключевое слово народ там угадал.


VD>Ха! Большивики еще говорили о том, что разумно было бы ввести неизменяемые локальные переменне.


Это из другой оперы. Большевики еще, к примеру, очень долго говорили, что одним из самых больших недостатков императивных возможностей шарпа является отсутствие возможности подключения реализаций. Тем не менее воз и ныне там.

VD>А вообще, МС как всегда реализует чужие идеи называя их своими инменами. Это дело в исходном виде называлось "вывод типов" (type inference).


Вот бы еще они mixins скоммунизьмили.

VD>Вот и ответ на все несоотвестия. Таки теперь мы будет иметь нормальный ОО-синтаксис вызова методов расширения. В общем, объект все что качается, если не качается, то раскачивается и признается объектом.


Ну, надо признать, что в Delphi.NET похожее уже есть.

AVK>>Сахар конечно, но забавно.


VD>Э... Не скажи. Это очень правильное решение. Это устраняет одно из серьезных несоотвествий. Теперь никакой педант не скажет, что ToString() ошибка, так как нельзя сделать ToMyClass().


VD>Единообразие много стоит.


ХЗ. ИМХО вопрос культуры программирования. С точки зрения архитектурных проблем это ничего не дает. А меня это волнует в первую очередь.

AVK>>Обсуждается необходимость расширяющих свойств, событий и операторов, но пока такое не поддержвается.


VD>Логично было бы позволить добавлять любые типы членов кроме пожалуй перменных.


Возможно, как с дженерик-свойствами, есть какие то синтаксические проблемы. Т.е. для методов добавление модификатора к параметру естественно, а вот со свойствами и событиями уже не так очевидно и требует сурового перетряхания грамматики. А вот почему операторы не добавили — ХЗ.

AVK>>3) Лямбда-выражения. Выражения, служащие для написания программ в функциональном стиле. Вобщем то в 2.0 анонимные методы очень на это похожи, но в 3.0 сделана попытка преобразовать внешний вид к более функциональному стилю. Для этого введен новый токен — =>.

AVK>>Пример:
AVK>>
AVK>>delegate R Func<A,R>(A arg);

AVK>>...

AVK>>Func<int,int> f1 = x => x + 1;            // Ok
AVK>>Func<int,double> f2 = x => x + 1;        // Ok
AVK>>Func<double,int> f3 = x => x + 1;        // Error
AVK>>


VD>То есть это только сахар?


Все, что сейчас описано это сахар, потому что существующая реализация работает на 2 фреймворке.

VD> Хотя конечно и это полезно. Уж больно много места занимает никчемное ключевое слово delegate и описание параметров анонимного метода.


+1

VD>Однако для полноценного применения функционального стиля нужно сделать еще два шага. Во первых ввести передачу лямд без делегатов, чтобы можно было делать лямбда-преоразования и соответсвенно строить методы из кусков,


Возможно можно будет что то соорудить на базе expression tree.

AVK>> Хотя возможность творить на этой базе извраты (особенно если совместно с дженериками) меня пугает.


VD>Гы. Не боись. У функционального стиля большой потенциал. А ламерам останется Васик.


Не факт . В нем тоже может многое из этого появится. Надо глядеть. Да и потом — для любителей извратов есть С++/CLI

VD>Ё! И об этом говорили большивеки в "Философии".


Как то прошло мимо моего глаза.

VD>Гы. Это же они и есть — tuple-ы.


VD>Так что предыдущий пример должен будет выглядеть так:

VD>
VD>var dict = new Dictionary<string, int>
VD>{
VD>  new { "one", 1 }, new { "two", 2 }, new { "three", 3 }
VD>};
VD>


Не, это работать не будет. Во-первых это просто неверный синтаксис, правильно так:
var dict2 = new Dictionary<string, int>
{
    new { Key = "one", Value = 1 },
    new { Key = "two", Value = 2 },
    new { Key = "three", Value = 3 }
};

Потом, компилятор создаст свой класс, а в collection initializer нужно тот тип, который T в реализованном ICollection<T>. Т.е., в случае Dictionary это KeyValuePair. Текущий компилятор на такой код говорит следующее:
TupleDic.cs(15,9): error CS0029: Cannot implicitly convert type 'Test.<Projection>f__0' to 'System.Collections.Generic.KeyValuePair<string,int>'

Да, еще компилятор не понимает явную реализацию интерфейсов, так что даже мой вариант не компилируется, говорит что:
TupleDic.cs(7,42): error CS1501: No overload for method 'Add' takes '1' arguments

Хотя в спецификации написано, то он будет искать Add именно у ICollection<T> (и иногда так и делает, судя по предыдущей ошибке). ИМХО просто баг.

VD>А с чего он взял, что Name и Price — это свойства, а не поля?


С того, что так написано в спецификации.

VD>Не. Ты точно не правильно понял. Анонимные типы == кортежи. Кортежи сравниваются по значению и должны мочь использоваться везде где применимы длругие типы. Но должен быть синтаксис описания анонимных типов без декларации. Тогда их можно будет использовать как возвращаемые занчения функций и как параметры функций. Корче это неотемлемая часть функционального стиля!


Может быть. Но если ты приведешь компилируемый пример, тогда я поверю. Пока же, по текущей спецификации, это не работает. Единственное — компилятор на одинаковые объявления генерирует один и тот же класс. Это видно в самой последней строчке примера.

AVK>>ИМХО изврат редкостный. Насколько это будет полезно я пока ответить затрудняюсь.


VD>...хотя очень уж смахивает на list comprehension из таких языков как Питон, Хаскель и т.п. Вообще штука забавная, но уж больно диковинно реализованно. Хотя я могу ошибаться. Тут нужно попробовать на практике.


ИМХО слишком узкоспециализированно.

VD>Гы. Темнота. Это такой изращенческий способ открыть дверь в мир лямбда-исчислений, а точнее лямбда-конверсий, т.е. в мир комбинаторной логики. Дело в том, что делегаты далеко не самый эффективный способ работы с функциями. Они приводят к динамическому полиморфизму, что как минимум медленее нежели статический. Теория лямбда-конверсий подразумевает, что над методами можно производить разные вычисления какбудто это объекты. Таким образом можно из одних методов создавать другие. Причем результат может быть очень и очень забавным.


Но из текущей спецификации ничего такого не видно.

VD>Про операциями над этими выражениями ничего не сказано?


Нет. Там почти ничего не рассказано про эту фишку.
... << RSDN@Home 1.2.0 alpha rev. 617>>
AVK Blog
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.