Skip to content

Latest commit

 

History

History
76 lines (50 loc) · 3.09 KB

9.3.具体化.md

File metadata and controls

76 lines (50 loc) · 3.09 KB

9.3.具体化

Haxe编译器允许具体化表达式、类型和类来简化宏的使用。具体化的语法是 macro expr ,expr 是任何有效的Haxe表达式。

9.3.1.表达式具体化

表达式具体化用于以一个便捷的方式创建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()

9.3.2.类型具体化

类型具体化用于以一个简便的方式创建 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

9.3.3.类具体化

还可以使用具体化来获取一个 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的字段数组获得。