В Nemerle есть макрос using-catch:
using System;
class X : IDisposable
{
public Dispose() : void {}
}
class P
{
static Main() : void
{
using (x = X())
{
Console.WriteLine("A");
}
catch
{
| _ => Console.WriteLine("B");
}
}
}
Однако генерируемый код Main эквивалентен:
def x = X();
try { ... }
catch { ... }
finally { (x :> IDisposable).Dipose(); }
А не:
try
{
using (x = X())
{
...
}
}
catch { ... }
Это может быть неочевидно. (Я как раз ожидал второе поведение)
Также нет способа выбрать куда ставить catch.
Аналогичная проблема возникнет если захотим реализовать using-finally.
Возможно ли придумать синтаксис с которым можно будет это решить красиво ?
Типа:
using (x = X()) { ... }
catch create { ... }
catch { ... }