문제

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.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top