Re: Помогите с макросом
От: VladD2 Российская Империя www.nemerle.org
Дата: 06.10.17 07:47
Оценка: 6 (1)
Здравствуйте, kaa_t, Вы писали:

_>Написал такой макрос. Все работает если в методах нет return или yield.

_>Как узнать что в методе используется ключевое слово yield?

Можно найти yield в коде метода с помощью класса Nemerle.Compiler.ExprWalker:
foreach(m is MethodBuilder in typeBuilder.GetMethods())
{
  mutable hasYield = false;
  def walker = ExprWalker();
  def walk(info : ExprWalkInfo) : void
  {
    when (info.Node is PExpr.MacroCall(name=Name(Id="yield")))
    {
      hasYield = true;
      info.Stop();
    }
  }
  walker.Walk(m.Body, walk);

  when (hasYield)
    Message.Hint(m.Location, $"The method '$(m.Name)' call 'yield' macro.");
}


_>Как побороть ошибку error : goto (block return?) is not allowed inside expressions


Эта ошибка означает, что где-то есть нелокальный выход из функции или выражения. Например, если написать break внутри локальной функции находящейся в цикле, то может появиться такое сообщение. Или если написать return внутри выражения.

Часто это бывает связано с некорректной генерацией кода.

В приведенном фрагменте вроде ничего такого нет. Но в нем есть применение каких-то макросов. Возможно ошибка в них.

Вот в этом нет смысла:
_>
_>          <[
_>          {
_>            mutable result;
_>            try { $(name:usesite) = true; result = $(m.Body)   } finally { $(name:usesite) = false;   }
_>            result;
_>          }
_>          ]>
_>


блок try и так возвращает значение. Можно выбросить if и всегда возвращать первый вариант кода.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.