Мой макрос должен генерировать специализированный код, если некое выражение имеет тип из подмножества примитивных: 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
}
}
Как это сделать лучше?
Здравствуйте, 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 сравнить с типом, который вывелся.
Здравствуйте, 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);".
Подробности можно поглядеть поиском по исходникам компилятора.