Реализовал goto в виде макросов goto / label в пространстве имен Nemerle.Imperative.GoTo.
За одно поправил баги иногда приводящие к сообщению "non local goto".
Кроме того индексируемое свойство UserData теперь есть у MethodBuilder-ов. Так что в него можно сохранять данные относящиеся ко всему методу. Это свойство сбрасывается вначале типизации метода. Так что очищать специально его нет смысла.
Реализация.
Пример использования:
using System.Console;
using Nemerle.Imperative;
using Nemerle.Imperative.GoTo;
module Program
{
Main(args : array[string]) : void
{
goto Start;
label Label2;
WriteLine("Label2:");
goto End;
label Start;
WriteLine("Start:");
when (args.Length == 0)
goto Label1;
WriteLine("args.Length != 0");
return;
label Label1;
WriteLine("Label1:");
goto Label2;
label End;
WriteLine("End:");
}
}
/*
BEGIN-OUTPUT
Start:
Label1:
Label2:
End:
END-OUTPUT
*/