2013-01-02 74 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類本身之前運行宏(它添加了函數)。