automatic casts, как в Kotlin
От: Пельмешко Россия blog
Дата: 13.11.11 21:54
Оценка: +1
Здравствуйте, 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: Ветка выделена из темы Хабрахабр
Автор: Пельмешко
Дата: 13.11.11
— kochetkov.vladimir
14.11.11 14:32: Перенесено модератором из 'О жизни' — kochetkov.vladimir
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.