Синтаксис лямбды и анонимных методов
От: VladD2 Российская Империя www.nemerle.org
Дата: 10.07.06 21:10
Оценка: 55 (8)
#Имя: FAQ.dotnet.delegate.to.lambda
Здравствуйте, Lloyd, Вы писали:

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


VD>>Да фиг с ним с 2.0. Хотелось бы вообще пример выпячивающий "убогость и ограниченность".


L>Пардон, а разве лямбды C# 3.0 не должны быть представимы в виде expression tree? Если это не так, то посыпаю голову пеплом и признаю себя неправым.


Должна, но не обязана. Лябда в общем-то ни что иное как упрощенный синтаксис для тех самых анонимных методов. Просто было сделано несколько расширений:
1. Выбросили ключевое слово delegat и позволили не обрамлять скобками параметры если их число равно еденице.
2. Позволили, если анонимный метод содержит единственное выражение (expression, т.е. не содержит statment-во, ну, if, switch, for...) записывать его в укороченной форме, без ключевого слова return и обрамляющего блока (фигурных скобок).
3. Позволили опускать типы параметров в случаях когда их можно вывести из контекста использования (обычно из анализа содержимого люмбды или описания делегата в который помещается ссылка на лямду).
4. Ввели соглашение по которому если лямбда-функция присваевается не делегату, а специальному (захардкоженному) системному типу, то вместо кода компилятор генерирует то самое дерево выражения. Это нужно чтобы иметь возможность получить код не в виде МСИЛ-а, а в виде AST (зачем они назвали это дело деревом выражения я не знаю, маркетологи, блин) пригодного для программного анализа и сереализации (например, для передачи по сети).

Собественно все. В остальном это те же анонимные методы. Почти уверен, что к релизу анонимные методы можно будет использовать в контексте лямбд (например, при присвоении дереву выражения). Если это не будет сделано, то это будет еще один косяк.

Вот пример постепенного преобразования анонимного метода в аналогичную лямбду:
delegate(Point p){ return p.X == finded_X; } // Исходный анонимный метод
(Point p) => { return p.X == finded_X; }     // Убираем ключевое слово delegate заменяя его на синтаксис лямбды "=>"
(p) => { return p.X == finded_X; }           // Убираем явное указание типа параметра надеясь на то, что он будет вычеслин из использования лямбды
p => { return p.X == finded_X; }             // Убираем необязательные для лямбд с одним параметром скобки (строго говоря только такие функции и могут называться лямбдами)
p => p.X == finded_X                         // Убираем "процедурный" синтаксис заменяя его на синтаксис выражений.

Жирным выделены фрагменты синтаксиса устраняемые на следующем шаге.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
lambda delegate
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.