2013-01-02 39 views
1

我想编写自己的宏来创建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; 
    } 
} 

我读了相应的文档,但老实说,我觉得他们很困惑。

感谢

回答

1

你可能想看看小叮当如何解决同一个问题:https://github.com/back2dos/tinkerbell/wiki/tink_lang#wiki-accessors

+0

嗨佛朗哥,我看了一下 - 唉,它很迷惑。 我也看过https://github.com/back2dos/tinkerbell/blob/master/src/tink/lang/macros/PropBuilder.hx,但它做了很多事情,它真的不能回答我更基本的问题。例如为什么所有的小叮当类实现“tink.lang.Cls”或者宏系统如何对“@:xxx”做出反应?为什么会触发宏观系统? “@:prop”和类PropBuilder之间的关联又是什么?我无法找到任何信息 – robkuz

0

Type Builder exampleHaxe 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类本身之前运行宏(它添加了函数)。