문제
Boo와 함께 작업하고있는 확장 가능한 카드 게임 엔진을위한 DSL을 만들고 있습니다.
새 유형의 카드 용 클래스를 생성하는 카드 매크로가 있으며 생성자의 일부 속성을 초기화합니다. 그 매크로에는 다른 것들을 설정하기위한 몇 가지 잠수함이 있습니다. 기본적으로 나는 다음과 같은 것을 바꾸기를 원합니다.
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를 사용하여 무엇을 해야하는지 모르겠습니다. Macro가 Macro가 생성자에 코드를 추가하면서 중첩 클래스를 생성합니다. 이견있는 사람? 이것은 현재 언어 기능으로 수행 할 수 있습니까?
해결책
할 수 있습니다. 방법은 다음과 같습니다.
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에게 Boo Google Group.
제휴하지 않습니다 StackOverflow