如何为属性扩展创建宏

时间:2013-01-02 20:00:35

标签: 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;
    }

    public function getBar():String {
        return this.bar;
    }
 }

我阅读了相应的文档,但说实话,我觉得它们很混乱。

感谢

2 个答案:

答案 0 :(得分:1)

您可能想看一下tinkerbell如何解决同一问题:https://github.com/back2dos/tinkerbell/wiki/tink_lang#wiki-accessors

答案 1 :(得分:0)

Type Builder example中找到的这个Haxe Manual(在下面粘贴以供参考,但在链接上有更好的描述)是向类添加函数的一个很好的简单示例。

添加属性将大致相同。我添加了一个跟踪(字段)循环来帮助了解它们是如何定义的:

<强> Main.hx

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

<强> TypeBuildingMacro.hx

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;
  }
}

请注意,Main.hx必须使用@:build元数据调用宏,因此编译器知道在处理Main类之前运行宏(添加函数)。