Создаю макрос
def typedExpr = typer.TypeExpr(a);
def ty = typedExpr.Type;
ty имеет тип List[T], как вытащить тип T?
Здравствуйте, Аноним, Вы писали:
А>Создаю макрос
А>А>def typedExpr = typer.TypeExpr(a);
А>def ty = typedExpr.Type;
А>
А>ty имеет тип List[T], как вытащить тип T?
Сходу не скажу, но советую перед интересующим кодом поставить assert2(false) и тогда уже копаться в дебаггере.
В классах компилятора очень много неразберихи, но практически всегда можно отыскать необходимую информацию.
Здравствуйте, Аноним, Вы писали:
А>А>def typedExpr = typer.TypeExpr(a);
А>def ty = typedExpr.Type;
А>
А>ty имеет тип List[T], как вытащить тип T?
Как-то так:
def typedExpr = typer.TypeExpr(a);
def ty = typedExpr.Type;
def listType = <[ ttype: System.Collections.Generic.List[_] ]>;
if (ty.TryRequire(listType)) // если известно, что тип точно List, то вместо TryRequire можно использовать Require
{
// ...если может, то «жестко» требуем этого.
ty.ForceRequire(listType);
def искомыйТип = listType.args.Head;
}
else
// обрабатываем ошибку
Чтобы цитата ttype работала нужно чтобы код вызывался непосредственно из кода макроса или чтобы в метод был передан Typer и вызван метод Macros.DefineCTX(typer).
Более подробная информация
здесьАвтор(ы): Владислав Юрьевич Чистяков
Дата: 03.09.2009
В данной части статьи рассказывается о том, как работает система вывода типов Nemerle, о том, как с ней могут взаимодействовать макросы Nemerle, и что это дает
.
Здравствуйте, Аноним, Вы писали:
А>А>def typedExpr = typer.TypeExpr(a);
А>def ty = typedExpr.Type;
А>
Еще нужно понимать, что тип может быть еще не выведен в данный момент. Так что в ty еще не будет нужных данных. Тогда нужно подождать пока тип выведется. О том как можно это сделать тоже написано в
статьеАвтор(ы): Владислав Юрьевич Чистяков
Дата: 03.09.2009
В данной части статьи рассказывается о том, как работает система вывода типов Nemerle, о том, как с ней могут взаимодействовать макросы Nemerle, и что это дает
. Require может помочь выводу типа. Так что его можно наложить сразу.
Require подразумевает сабтайпинг, то есть унификация пройдет даже если будет не List, а его подтипы (если такое возможно). Если нужно точное совпадение, вместо Require нужно использовать метод Unify.
Здравствуйте, Аноним, Вы писали:
А>А>def typedExpr = typer.TypeExpr(a);
А>def ty = typedExpr.Type;
А>
А>ty имеет тип List[T], как вытащить тип T?
Да, если там точно List, то можно и проще чем я описал выше:
def ty = typedExpr.Type.Fix() :> FixedType.Class;
def искомыйТип = ty.args.Head;