Haxe编译器允许具体化表达式、类型和类来简化宏的使用。具体化的语法是 macro expr ,expr 是任何有效的Haxe表达式。
表达式具体化用于以一个便捷的方式创建haxe.macro.Expr的实例。Haxe编译器接受通常的Haxe语法并翻译它到一个表达式对象。它支持几种转义机制,都是通过 $ 符号触发:
- ${} 和 $e{}: Expr -> Expr 这可以被用来合并表达式。 {}界限内的表达式被执行,使用它的值进行替换。
- $a{}: Expr -> Array 如果用于一个 预期为Array的位置(如调用参数,块元素),$a{} 把数组作为它的值。否则它生成一个数组声明。
- $b{}:Array->Expr 从给定的表达式数组生成一个块级表达式。
- $i{}:String->Expr 从给定字符串生成一个标识符。
- $p{}:Array->Expr 从给定字符串数组生成一个字段表达式。
- $v{}:Dynamic->Expr 根据它的参数的类型生成一个表达式。这仅仅保证使用在基本类型和枚举实例。
另外,元数据 @:pos(p) 可以用来映射注解表达式的位置到 p ,而不是被具体化的位置。
这类具体化只工作于 内部结构预期一个表达式时。不允许 object.${fieldName},但是 object.$fieldName 可以使用。这适用于所有内部构造预期一个字符串的位置:
字段访问 object.$name 变量名称 var $name = 1;
从Haxe 3.1.0 以后:
字段名 { $name: 1} 函数名 function $name() { } 捕获变量名 try e() catch($name:Dynamic) { }
此外,一个新的表达式可以通过提供 haxe.macro.TypePath 参数被具体化: new $typePath()
类型具体化用于以一个简便的方式创建 haxe.macro.Expr.ComplexType 的实例。通过一个 macro : Type 定义,Type 可以是任何有效的类型路径表达式。这类似于普通代码中的显式类型提示,例如对于变量,形式为 var x:Type 。
ComplexType的每个构造函数都有不同的语法:
TPath: macro : pack.Type TFunction: macro : Arg1 -> Arg2 -> Return TAnonymous: macro : { field: Type } TParent: macro : (Type) TExtend: macro : {> Type, field: Type } TOptional: macro : ?Type
还可以使用具体化来获取一个 haxe.macro.Expr.TypeDefinition 的实例。这是通过 macro 类语法表示的,如下面显示的:
class Main {
macro static function generateClass(funcName:String) {
var c = macro class MyClass {
public function new() { }
public function $funcName() {
trace($v{funcName} + " was called");
}
}
haxe.macro.Context.defineType(c);
return macro new MyClass();
}
public static function main() {
var c = generateClass("myFunc");
c.myFunc();
}
}
生成的 TypeDefinition 实例通常传递到 haxe.macro.Context.defineType 来添加一个i额新的类型到调用上下文(不是宏上下文本身)。
这类的具体化可以用于获得 haxe.macro.Expr.Field的实例,可从生成的TypeDefinition的字段数组获得。