Здравствуйте, VladD2, Вы писали:
VD>Кстати, всем кто улыбнулся прочтя твои строки, очень советую не пробовать немерл. Буквально месяц реального использования и от C# начинается натуральная ломка. Причем это даже если не написать ни одного собственного макроса. А на работе, ведь, могут не дать применять то что хочется.
Да я серьёзно, вот фрагмент одной штуки из одного секретного продукта, над которым я работаю:
private static IForeachStatement IsYieldForeachPattern(IYieldStatement yieldReturn, IType ienumerableType)
{
// detect "yield return $0;" where $0 - reference expression
var yieldExpression = yieldReturn.Expression as IReferenceExpression;
if (yieldExpression == null) return null;
// detect if "yield return $0;" is right inside foreach statement
var foreachStatement = yieldReturn.Parent as IForeachStatement;
if (foreachStatement == null)
{
// ok, we may be inside single statement block
var block = yieldReturn.Parent as IBlock;
if (block == null || block.Statements.Count != 1) return null;
foreachStatement = block.Parent as IForeachStatement;
if (foreachStatement == null) return null;
}
// detect if $0 resolves into foreach statement iteration variable
if (foreachStatement.IteratorDeclaration == null) return null;
var target = foreachStatement.IteratorDeclaration.DeclaredElement;
var resolved = yieldExpression.Reference.Resolve().DeclaredElement;
if (!DeclaredElementEqualityComparer.ElementComparer.Equals(target, resolved)) return null;
// detect the type of foreach statement collection expression
if (foreachStatement.Collection == null) return null;
var collectionType = foreachStatement.Collection.Type();
if (collectionType.IsUnknown) return null;
// detect if foreach statement collection is convertible into IEnumerable<T>
var conversionRule = foreachStatement.GetTypeConversionRule();
if (!conversionRule.IsImplicitlyConvertibleTo(collectionType, ienumerableType)) return null;
return foreachStatement;
}
Представляешь как этот треш мог бы выглядеть лишь благодаря паттерн-матчингу? Меня уже трясёт от:
var someNode = node as SomeNode;
if (someNode != null) {
...
}
и визиторов всяких.
VD>Я, вообще-то, тоже с юмором. Я ж тебя не первый год знаю.
А мне всегда кажется, что ты меня забываешь. Я к тебе на альтнетике даже знакомиться подходил, а ты сказал, что не знаешь такого
p.s. [немного оффтопа] кстати, а можно-ли на макросах "забабахать" automatic casts, как в Kotlin? Типа:
object x = 0;
if (x is int) {
int y = x + 1;
Console.WriteLine(y);
}
или типа:
void Foo(int? x) {
if (x != null) {
int y = x + 1; // никаких x.Value
...
}
}
То есть макросом поменять тип некоторой локальной переменной внутри некоторого скоупа. Если такое выражается макросом, то круто вообще!
14.11.11 14:32: Перенесено модератором из 'О жизни' — kochetkov.vladimir