Здравствуйте, VladD2, Вы писали:
CU>>Вопрос такой, как определить перечисление в макросе и добавить как подтип в классе?
VD>Что-то вроде этого:
VD>VD>[MacroUsage(MacroPhase.BeforeTypedMembers,MacroTargets.Class,Inherited=true)]
VD>macro statemachine(ty : TypeBuilder)
VD>{
VD> // генерируем список определений полей перечисления
VD> def cases = ty.DeclaredNestedTypes.Map(t => <[ decl: | $(t.ParsedName : name); ]>);
VD> def enumTypeBuilder = ty.DefineNestedType( // вложенные типы нужно добавлять только с помощью DefineNestedType
VD> <[ decl:
VD> public enum StateID
VD> {
VD> ..$cases
VD> }
VD> ]>, true);
VD> enumTypeBuilder.Compile();
VD>}
VD>
спасибо, работает!
CU>>И последний вопрос, если писать DSL то потребуется много ключевых слов, при этом они как то должны взаимодействовать между собой, проходит синтаксические и семантические проверки, для этого надо чтобы текст разбирался и получалось некое описание на DSL, для этого нужен какой то объект который хранит в себе все состояние описанной структуры, то есть должен быть доступен на этапе компиляции и при вызове макроса через помеченные объекты или описание в методе, добавлять информацию в этот объект, то есть должен создаваться один раз и жить в остальное время.
VD>Это все очень сильно зависит от задачи говорить о чем-то в ообщем невозможно.
CU>>Еще может потребоваться некоторые члены удалять, которые не несут в себе никакой информации для приложения, например классы для описания вложенной иерархии нужные макросу, но ненужные в рантайме, было бы хорошо удалить чтобы они были не видны, но TypeBuilder допускает объявлять члены, но не допускает удалять и многие внутренние поля компилятора read-only, можно ли решить как то эту задачу?
VD>Удалаять нельзя. Но нужную метаинформацию можно описать в другом виде. Например в виде доп-синтаксиса, или в виде мета-атрибутов.
VD>В общем, лучше опиши стоящую задачу (без ее реализации), а мы попробуем как ее лучше реализовать.
Задача такова, есть библиотека описания автоматов состояний в коде аналогичным в UML, проблема в том что описание структуры автомата сложно читаемое и создаваемое вручную, хотелось бы автоматизировать этот процессс за счет макросов и DSL, я уже видел решение подобной задачи в Boo, но хотелось бы попробовать сделать такое решение на Nemerle, под нужную библиотеку, там имеются разные процедуры для описания иерархии автомата, хотелось бы например сделать иерархическое визуальное описание иерархии, например:
[statemachine]
class TestFSM
{
[state]
class Top
{
[state]
class Start
{
[state]
class Sub
{
entry() : void
{
// действие при входе
}
exit() : void
{
// действие при выходе
}
}
}
[state]
class Next
{
transition("Sub",UserEvt) // описание перехода
}
}
}
как то так, на Boo там вообще абстрактно описали автомат, типа
state @Parked:
when @EngineStarted >> @IdleInNeutral
state @IdleInNeutral:
when @EngineKilled >> @Parked
when @GearEngaged >> @IdleInGear
state @IdleInGear:
when @GearDisengaged >> @IdleInNeutral
when @GasApplied >> @RacingAlong
state @RacingAlong:
when @BrakeApplied >> @IdleInGear
when @CarCrashedIntoTree >> @CarDestroyed
state @CarDestroyed
хотелось бы что то подобное создать и переводить все это на этапе компиляции в вызовы соответствующих методов в библиотеке автомата для инициализации, главная проблема в легком описании на каком то DSL или псевдоязыке, метааттрибутов, какие могут быть возможнные решения?