USING LATEST FROM GITHUB 201109
Sorry, on this site I will be answer only in Russiat.
macro Macro2(expr : PExpr)
syntax ("macro2", expr)
{
Macro2Impl.DoTransform(Macros.ImplicitCTX(), expr )
}
module Macro2Impl
{
public DoTransform(typer : Typer, expr : PExpr ) : PExpr
{
def tt = typer.TypeExpr(<[XXX]>); <-- COMPILER ERROR: unbound name 'XXX'
<[]>
}
Да. И это корректное поведение.
if I Wrap everything in try except i get internal compiler error:
try
{
def tt = typer.TypeExpr(<[XXX]>);
}
catch
{
_ => ();
}
<[]>
Это нельзя делать.
Чтобы сделать спекулятивную типизацию (которая не будет влиять на результат компиляции) можно воспользоваться следующим паттерном:
typer.Solver.PushState();
try
{
def localErrorsCount = typer.Solver.CurrentMessenger.LocalErrorCount;
def res = typer.TypeExpr(<[ XXX ]>);
when (localErrorsCount != typer.Solver.CurrentMessenger.LocalErrorCount)
Message.Hint($"$res ($(res.GetType()))");
}
finally typer.Solver.PopState();
Так же можно воспользоваться методом JustTry:
_ = typer.JustTry(
fun()
{
def localErrorsCount = typer.Solver.CurrentMessenger.LocalErrorCount;
def res = typer.TypeExpr(<[ XXX ]>);
when (localErrorsCount != typer.Solver.CurrentMessenger.LocalErrorCount)
Message.Hint($"$res ($(res.GetType()))"); // do something if success
});