Как разобрать тип?
От: Аноним  
Дата: 01.07.14 13:15
Оценка:
Создаю макрос

def typedExpr = typer.TypeExpr(a);
def ty = typedExpr.Type;



ty имеет тип List[T], как вытащить тип T?
Re: Как разобрать тип?
От: ionoy Эстония www.ammyui.com
Дата: 01.07.14 13:28
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Создаю макрос


А>
А>def typedExpr = typer.TypeExpr(a);
А>def ty = typedExpr.Type;
А>


А>ty имеет тип List[T], как вытащить тип T?


Сходу не скажу, но советую перед интересующим кодом поставить assert2(false) и тогда уже копаться в дебаггере.

В классах компилятора очень много неразберихи, но практически всегда можно отыскать необходимую информацию.
www.livexaml.com
www.ammyui.com
www.nemerleweb.com
Re: Как разобрать тип?
От: VladD2 Российская Империя www.nemerle.org
Дата: 01.07.14 20:03
Оценка:
Здравствуйте, Аноним, Вы писали:

А>
А>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, и что это дает
.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re: Как разобрать тип?
От: VladD2 Российская Империя www.nemerle.org
Дата: 01.07.14 20:08
Оценка:
Здравствуйте, Аноним, Вы писали:

А>
А>def typedExpr = typer.TypeExpr(a);
А>def ty = typedExpr.Type;
А>


Еще нужно понимать, что тип может быть еще не выведен в данный момент. Так что в ty еще не будет нужных данных. Тогда нужно подождать пока тип выведется. О том как можно это сделать тоже написано в статье
Автор(ы): Владислав Юрьевич Чистяков
Дата: 03.09.2009
В данной части статьи рассказывается о том, как работает система вывода типов Nemerle, о том, как с ней могут взаимодействовать макросы Nemerle, и что это дает
. Require может помочь выводу типа. Так что его можно наложить сразу.

Require подразумевает сабтайпинг, то есть унификация пройдет даже если будет не List, а его подтипы (если такое возможно). Если нужно точное совпадение, вместо Require нужно использовать метод Unify.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re: Как разобрать тип?
От: VladD2 Российская Империя www.nemerle.org
Дата: 01.07.14 20:12
Оценка:
Здравствуйте, Аноним, Вы писали:

А>
А>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;
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.