Условный using
От: WolfHound  
Дата: 16.01.17 23:31
Оценка:
Глядя на этот код из соседнего сообщения видна излишняя связь между фичами языка.
namespace CSharp
{
  syntax module AsyncAwait
  {
    using CSharp.Core;
    using CSharp.AnonymousFunction;

    keyword regex ['A'..'Z', 'a'..'z', '_'..'_']+ rule S;

    extend syntax Modifier
    {
      | AsyncMod  = "async"sm;
    }

    extend syntax Expression
    {
      | Lambda_SingleParam2    = "async" sm Name                               sm "=>" sm AnonymousFunctionBody;
      | Lambda_ExplicitParams2 = "async" sm ExplicitAnonymousFunctionSignature sm "=>" sm AnonymousFunctionBody;
      | Lambda_ImplicitParams3 = "async" sm ImplicitAnonymousFunctionSignature sm "=>" sm AnonymousFunctionBody;
      | AnonymousFunction2     = "async" sm "delegate"sm ExplicitAnonymousFunctionSignature? nl "{" inl Statement* d "}";

      | Await                  = "await" sm Expression;                                                // C# 5
    }
  }
}

Чтобы избежать этого нужно разбить этот модуль на три
namespace CSharp
{
  syntax module AsyncAwait
  {
    using CSharp.Core;

    keyword regex ['A'..'Z', 'a'..'z', '_'..'_']+ rule S;

    extend syntax Modifier
    {
      | AsyncMod  = "async"sm;
    }

    extend syntax Expression
    {
      | Await                  = "await" sm Expression;                                                // C# 5
    }
  }

  syntax module AsyncAwaitAnonymousFunction
  {
    using CSharp.Core;
    using CSharp.AnonymousFunction;

    keyword regex ['A'..'Z', 'a'..'z', '_'..'_']+ rule S;

    extend syntax Expression
    {
      | Lambda_SingleParam2    = "async" sm Name                               sm "=>" sm AnonymousFunctionBody;
      | Lambda_ExplicitParams2 = "async" sm ExplicitAnonymousFunctionSignature sm "=>" sm AnonymousFunctionBody;
      | Lambda_ImplicitParams3 = "async" sm ImplicitAnonymousFunctionSignature sm "=>" sm AnonymousFunctionBody;
    }
  }

  syntax module AsyncAwaitAnonymousDelegate
  {
    using CSharp.Core;
    using CSharp.AnonymousDelegate;

    keyword regex ['A'..'Z', 'a'..'z', '_'..'_']+ rule S;

    extend syntax Expression
    {
      | AnonymousFunction2     = "async" sm "delegate"sm ExplicitAnonymousFunctionSignature? nl "{" inl Statement* d "}";
    }
  }
}

Но это создаст неудобства пользователям языка.
Людям придётся помнить, что, если они используют модули AsyncAwait и AnonymousFunction им нужно подключить AsyncAwaitAnonymousFunction.

Чтобы избежать этой головной боли можно добавить фичу позволяющую писать так:
namespace CSharp
{
  syntax module AsyncAwait
  {
    using CSharp.Core;
    //Это означает импортировать модуль CSharp.AsyncAwaitAnonymousFunction
    //только если CSharp.AnonymousFunction уже был импортирован
    using CSharp.AsyncAwaitAnonymousFunction when CSharp.AnonymousFunction;    
    using CSharp.AsyncAwaitAnonymousDelegate when CSharp.AnonymousDelegate;
    ...
  }
}

Технически это реализовать довольно легко.
Но нужно ли?

Кстати вот с этим безобразием
    keyword regex ['A'..'Z', 'a'..'z', '_'..'_']+ rule S;

Которое повторяется в каждом модуле нужно что-то сделать.
... << RSDN@Home 1.0.0 alpha 5 rev. 0>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.