[英]Difficult boo syntactic macro
我正在使用boo為正在使用的可擴展紙牌游戲引擎創建DSL。
我有一個card宏,它為一種新型的card創建一個類,並在構造函數中初始化一些屬性。 該宏具有一些用於設置其他內容的子宏。 基本上我希望它變成這樣的東西:
card 'A new card':
type TypeA
ability EffectA:
// effect definition
到這個:
class ANewCard (Card):
def constructor():
Name = "A new card"
Type = Types.TypeA
AddEffect(EffectA())
class EffectA (Effect):
// effectdefintion
效果肯定需要是一個類,因為它會被傳遞(這是一種策略模式)。
到目前為止,我有這個簡單的框架:
macro card:
yield [|
class $(ReferenceExpression(card.Arguments[0])) (Card):
def constructor():
Name = $(card.Arguments[0])
|]
現在,我不知道該如何使用card.Body來使能力宏將代碼添加到構造函數中,同時還要生成一個嵌套類。 有什么想法嗎? 可以使用當前的語言功能嗎?
可以辦到。 這是如何做:
import Boo.Lang.Compiler.Ast
import Boo.Lang.PatternMatching
macro card(name as string):
klass = [|
class $(ReferenceExpression(name)):
def constructor():
Name = $name
|]
klass.Members.Add(card["effect"])
klass.GetConstructor(0).Body.Add(card["effect-ctor"] as Expression)
yield klass
macro effect(eff as ReferenceExpression):
card["effect"] = [|
class $eff (Effect):
pass
|]
card["effect-ctor"] = [| Effects.Add($(eff)()) |]
感謝Cedric Vivier協助我加入Google boo小組 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.