2010-09-10 54 views
10

我目前正在學習D,我想知道的其中一件事是D是否有一種方法來複制JVM語言的代碼生成功能。在D中編譯時間碼生成

這裏是一個場景: 我有一個對象,我想根據那個對象給出它的名字及其所有的字段。在Java/Scala中,我可以使用反射,但假設速度是個問題。我可以使用一個字節碼生成庫來動態生成並編譯一個沒有反射的類。這個實現可以分解爲遍歷對象的字段並通過遞歸得到它的名字,並使用該信息動態生成直接訪問字段的Java(或字節碼)。

如果你不喜歡這種情況,因爲它很弱和/或不現實,另一種更現實的可能是優化對象序列化。

我見過一些例子,其中編譯時間評估和/或模板元編程用於諸如在編譯時和其他遞歸算法中預先計算斐波那契數列的事情,但是有沒有一種方法可以用這種語言和一個編譯器,或者你需要開發一個單獨的代碼生成器並在編譯器之前運行它來獲得這種功能?

回答

5

字符串mixins可以訪問它們混合到的名稱空間。這包括this.tupleof,它可以用於迭代類的字段。序列化模板可能會利用該模板,否則強制用戶指定要手動序列化的字段;即。 class Class : ISerializable { int foo; Forble bar; mixin(genSerialize("foo, bar")); ... }

6

不僅可以做到這一點,它在D2中幾乎爲您完成。你所需要的只是一個小型的混音器,可以將這些功能從編譯時功能轉換爲運行時功能。

  • 對於班級名稱,您需要做的就是在班級範圍內評估typeof(this).stringof

  • 有關所有字段的列表,請嘗試__traits(allMembers, typeof(this)),然後過濾出不是字段的內容(在這裏可以使用std.traits)。

+0

請問,你可以考慮這[後](http://stackoverflow.com/questions/11314596/listing-a-classs-methods-trough-mixin)? – menjaraz 2012-07-22 18:27:43