Macros 如何为属性扩展创建宏

Macros 如何为属性扩展创建宏,macros,haxe,Macros,Haxe,我想编写自己的宏来在Haxe中创建类似属性的对象。 这个问题与其说是关于属性,不如说是关于编写宏。 (可能NME已经有了一个宏) 在haxe上这门课 class Foo { @:property var bar:String; } 我想把这个扩展到 class Foo { private var bar:String; public function setBar(_val:String):void { this.bar = _val; }

我想编写自己的宏来在Haxe中创建类似属性的对象。 这个问题与其说是关于属性,不如说是关于编写宏。 (可能NME已经有了一个宏)

在haxe上这门课

class Foo {
    @:property var bar:String;
}
我想把这个扩展到

class Foo {
    private var bar:String;

    public function setBar(_val:String):void {
        this.bar = _val;
    }

    public function getBar():String {
        return this.bar;
    }
 }
我读了相应的文档,但老实说,我发现它们非常混乱


谢谢

您可能想看看tinkerbell是如何解决同一问题的:

您可能想看看tinkerbell是如何解决同一问题的:

这是一个在类中添加函数的简单示例(粘贴在下面以供参考,但链接中有更好的描述)

添加属性也差不多。我添加了一个跟踪(字段)循环,以帮助了解它们是如何定义的:

Main.hx

@:build(TypeBuildingMacro.build("myFunc"))
class Main {
  static public function main() {
    trace(Main.myFunc); // my default
  }
}
import haxe.macro.Context;
import haxe.macro.Expr;

class TypeBuildingMacro {
  macro static public function build(fieldName:String):Array<Field> {
    var fields = Context.getBuildFields();
    for (field in fields) { trace(field); }
    var newField = {
      name: fieldName,
      doc: null,
      meta: [],
      access: [AStatic, APublic],
      kind: FVar(macro : String, macro "my default"),
      pos: Context.currentPos()
    };
    fields.push(newField);
    return fields;
  }
}
TypeBuildingMacro.hx

@:build(TypeBuildingMacro.build("myFunc"))
class Main {
  static public function main() {
    trace(Main.myFunc); // my default
  }
}
import haxe.macro.Context;
import haxe.macro.Expr;

class TypeBuildingMacro {
  macro static public function build(fieldName:String):Array<Field> {
    var fields = Context.getBuildFields();
    for (field in fields) { trace(field); }
    var newField = {
      name: fieldName,
      doc: null,
      meta: [],
      access: [AStatic, APublic],
      kind: FVar(macro : String, macro "my default"),
      pos: Context.currentPos()
    };
    fields.push(newField);
    return fields;
  }
}
导入haxe.macro.Context;
导入haxe.macro.Expr;
类TypeBuildingMacro{
宏静态公共函数生成(字段名:字符串):数组{
var fields=Context.getBuildFields();
对于(字段中的字段){trace(field);}
var newField={
名称:fieldName,
doc:null,
meta:[],
访问:[无状态,无公共],
种类:FVar(宏:字符串,宏“我的默认值”),
pos:Context.currentPos()
};
fields.push(newField);
返回字段;
}
}
请注意,Main.hx必须使用
@:build
元数据调用宏,以便编译器知道在处理主类本身之前运行宏(添加函数)。

这(粘贴在下面以供参考,但链接中有更好的描述)是一个很好的方法,向类添加函数的简单示例

添加属性也差不多。我添加了一个跟踪(字段)循环,以帮助了解它们是如何定义的:

Main.hx

@:build(TypeBuildingMacro.build("myFunc"))
class Main {
  static public function main() {
    trace(Main.myFunc); // my default
  }
}
import haxe.macro.Context;
import haxe.macro.Expr;

class TypeBuildingMacro {
  macro static public function build(fieldName:String):Array<Field> {
    var fields = Context.getBuildFields();
    for (field in fields) { trace(field); }
    var newField = {
      name: fieldName,
      doc: null,
      meta: [],
      access: [AStatic, APublic],
      kind: FVar(macro : String, macro "my default"),
      pos: Context.currentPos()
    };
    fields.push(newField);
    return fields;
  }
}
TypeBuildingMacro.hx

@:build(TypeBuildingMacro.build("myFunc"))
class Main {
  static public function main() {
    trace(Main.myFunc); // my default
  }
}
import haxe.macro.Context;
import haxe.macro.Expr;

class TypeBuildingMacro {
  macro static public function build(fieldName:String):Array<Field> {
    var fields = Context.getBuildFields();
    for (field in fields) { trace(field); }
    var newField = {
      name: fieldName,
      doc: null,
      meta: [],
      access: [AStatic, APublic],
      kind: FVar(macro : String, macro "my default"),
      pos: Context.currentPos()
    };
    fields.push(newField);
    return fields;
  }
}
导入haxe.macro.Context;
导入haxe.macro.Expr;
类TypeBuildingMacro{
宏静态公共函数生成(字段名:字符串):数组{
var fields=Context.getBuildFields();
对于(字段中的字段){trace(field);}
var newField={
名称:fieldName,
doc:null,
meta:[],
访问:[无状态,无公共],
种类:FVar(宏:字符串,宏“我的默认值”),
pos:Context.currentPos()
};
fields.push(newField);
返回字段;
}
}

请注意,Main.hx必须使用
@:build
元数据调用宏,这样编译器就知道在处理主类本身之前运行宏(它添加了函数)。

嗨,Franco,我已经研究过了-唉,它非常混乱。我也看了一眼,但是它做了很多事情,它真的没有回答我的更基本的问题。例如,为什么所有tinkerbell类都实现“tink.lang.Cls”,或者宏系统对“@:xxx”有何反应?为什么会触发宏观系统?还有“@:prop”和类PropBuilder之间的关联是什么。我找不到任何信息给这个Hi Franco,我查了一下——唉,这太令人困惑了。我也看了一眼,但是它做了很多事情,它真的没有回答我的更基本的问题。例如,为什么所有tinkerbell类都实现“tink.lang.Cls”,或者宏系统对“@:xxx”有何反应?为什么会触发宏观系统?还有“@:prop”和类PropBuilder之间的关联是什么。我找不到这方面的任何信息