Как лучше всего проверить тип в макросе?
От: catbert  
Дата: 27.10.10 19:00
Оценка:
Мой макрос должен генерировать специализированный код, если некое выражение имеет тип из подмножества примитивных: String, Double, Int32 и еще парочки.

Сейчас я матчу GetTypeCode из FixedType:

def expr_type = typer.TypeExpr(expr).FixedType();

match (expr_type.GetSystemType())
{
| null => blah-object
| t => 
    match (Type.GetTypeCode(t))
    {
    | TypeCode.Boolean => blah-bool
    | ... 
    | _ => blah-object 
    }
}


Как это сделать лучше?
Re: Как лучше всего проверить тип в макросе?
От: hardcase Пират http://nemerle.org
Дата: 27.10.10 19:54
Оценка: +1
Здравствуйте, catbert, Вы писали:

C>Мой макрос должен генерировать специализированный код, если некое выражение имеет тип из подмножества примитивных: String, Double, Int32 и еще парочки.


C>Как это сделать лучше?


О GetSystemType лучше забыть.

Для получения хорошо известных FixedType можно использовать следующий код:
def manager : ManagerClass = .....
FixedType.Class(manager.LookupTypeInfo("Dot.Separated.Name", 0), []);


Встроенные примитивные типы можно получить из InternalTypeClass, экземпляр которого доступен из манагера:
manager.InternalType.String // или Double или еще много всякого


Таким образом полученные FixedType можно стандартно через Equals сравнить с типом, который вывелся.
/* иЗвиНите зА неРовнЫй поЧерК */
Re: Как лучше всего проверить тип в макросе?
От: VladD2 Российская Империя www.nemerle.org
Дата: 27.10.10 20:31
Оценка:
Здравствуйте, catbert, Вы писали:

C>Сейчас я матчу GetTypeCode из FixedType:


Вот так точно делать не стоит. И вообще о существовании GetSystemType() лучше забыть.
Эти методы сделаны видимыми по ошибке.

C>
C>def expr_type = typer.TypeExpr(expr).FixedType();

C>match (expr_type.GetSystemType())
C>{
C>| null => blah-object
C>| t => 
C>    match (Type.GetTypeCode(t))
C>    {
C>    | TypeCode.Boolean => blah-bool
C>    | ... 
C>    | _ => blah-object 
C>    }
C>}
C>


C>Как это сделать лучше?


Лучше так:
def typer = Macros.ImplicitCTX();

def expr_type = typer.TypeExpr(expr);

match (expr_type.Hint)
{
  | Some(ty) => 
    if (ty.Equals(typer.InternalType.Double))
      ...
    else (ty.Equals(typer.InternalType.Int32))
      ...
}


Для получения других известных во время компиляции макроса типов можно воспользоваться следующей квази-цитатой:
[nemerle]
<[ ttype: System.Collections.Generic.IEnumerable[_] ]>

Она доступна только в теле макроса или если в текущем контексте вызвать "Macros.DefineCTX(typer);".

Подробности можно поглядеть поиском по исходникам компилятора.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.