Написание DSL на Nemerle и создание Enum в макросах
От: CodingUnit Россия  
Дата: 03.02.10 09:37
Оценка:
Здравствуйте, тут встала проблема написания сложного кода автоматически, за основу взяты макросы Nemerle, при это когда создаются новые ключевые слова их нельзя использовать в пространстве имен или в классе, видимо только в методе, иначе пишется сообщение об ошибке, так ли это?:
namespace TestFSM
{
  // ошибка пишет что требуется тип, макрос определен правильно
  statemachine Test
  {
  }

  class TestClass
  {
    // тоже самое
    statemachine Test
    {
    }
  }
}


Еще встала другая проблема, надо определить во время компиляции в макросе перечисление на основе кода, например так:
[MacroUsage(MacroPhase.BeforeTypedMembers,MacroTargets.Class,Inherited=true)]  
macro statemachine(ty : TypeBuilder)
{

// определяем перечисление, нормально
def stateid=ty.DefineNestedType(<[ decl:
  public enum StateID
  {
  }
  ]>);

..
def states : list[TypeBuilder]= ty.DeclaredNestedTypes; // получаем лист TypeBuilder-ов для внутренних типов

// для каждого типа добавляем имя в качестве константы к перечислению
states.Iter( x => stateid.Define(<[ $(x.Name)]>)); // не компилируется

// также просто если попробовать
stateid.Define(<[decl: | ABC ]>); // компилируется, но при выполнении ничего не происходит, новый член не добавляется
}

stateid.Compile(); // компилируем тип



// при этом если написать сразу список членов, то он определяется правильно:
def stateid=ty.DefineNestedType(<[ decl:
  public enum StateID
  {
  | ABC
  | BCD
  }
  ]>); // если бы была возможность как то в цитату вставить строки с описанием членов


Вопрос такой, как определить перечисление в макросе и добавить как подтип в классе? Как добавить динамически в макросе элементы в список перечисления, есть ли такая возможность?
И последний вопрос, если писать DSL то потребуется много ключевых слов, при этом они как то должны взаимодействовать между собой, проходит синтаксические и семантические проверки, для этого надо чтобы текст разбирался и получалось некое описание на DSL, для этого нужен какой то объект который хранит в себе все состояние описанной структуры, то есть должен быть доступен на этапе компиляции и при вызове макроса через помеченные объекты или описание в методе, добавлять информацию в этот объект, то есть должен создаваться один раз и жить в остальное время. Еще может потребоваться некоторые члены удалять, которые не несут в себе никакой информации для приложения, например классы для описания вложенной иерархии нужные макросу, но ненужные в рантайме, было бы хорошо удалить чтобы они были не видны, но TypeBuilder допускает объявлять члены, но не допускает удалять и многие внутренние поля компилятора read-only, можно ли решить как то эту задачу?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.