фазы макросов
От: para  
Дата: 22.09.09 13:10
Оценка:
Здравствуйте!
Пишу макрос, который
— добавляет в некий класс "ImplementedInterfce" — доступно в фазе 1 или 2
— модифицирует тела методов — доступно только в фазе 3

Как решать данную проблему?
Можно ли создать макрос, который бы приводил к вызову двух макросов:

[MacroX]
class C
...

=>
[Macro1]
[Macro2]
class C
...
Re: фазы макросов
От: Denom Украина  
Дата: 22.09.09 13:45
Оценка:
Здравствуйте, para, Вы писали:


/// Данное тело макроса отрабатывает на стадии BeforeTypedMembers
[Nemerle.MacroUsage (Nemerle.MacroPhase.BeforeTypedMembers, // можно и на этой стадии
                     Nemerle.MacroTargets.Assembly)]
macro GenerateMockObjects (params types : list[PExpr])
{
  Impl.Do(Nemerle.Macros.ImplicitCTX(), types)
}

/// Данное тело макроса отрабатывает на стадии WithTypedMembers
[Nemerle.MacroUsage (Nemerle.MacroPhase.WithTypedMembers, // можно и на этой стадии
                     Nemerle.MacroTargets.Assembly)]
macro GenerateMockObjects (params _types : list[PExpr])
{
  Impl.CompileGeneratedTypes(); // TypeBuilder-ы получены на предыдущей стадии
}


Даное решение используется в моём генераторе Mock объектов. Подсказал VladD2.
... << RSDN@Home 1.2.0 alpha 4 rev. 1237>>
Re: фазы макросов
От: VladD2 Российская Империя www.nemerle.org
Дата: 22.09.09 16:08
Оценка:
Здравствуйте, para, Вы писали:

P>Здравствуйте!

P>Пишу макрос, который
P>- добавляет в некий класс "ImplementedInterfce" — доступно в фазе 1 или 2
P>- модифицирует тела методов — доступно только в фазе 3

P>Как решать данную проблему?


Здесь: http://www.rsdn.ru/forum/nemerle/3544751.1.aspx
Автор: Denom
Дата: 22.09.09

Совершенно верно замечено, что макрос с одним и тем же именем можно вызвать на разных стадиях.

P>Можно ли создать макрос, который бы приводил к вызову двух макросов:


P>
P>[MacroX]
P>class C
P>...
P>

P>=>
P>
P>[Macro1]
P>[Macro2]
P>class C
P>...
P>


Можно, хотя для данной задачи и не нужно.
Макро-атрибут — это такой же атрибут как и обычный. Только он раскрывается на стадии компиляции.
Стало можно сделать так, чтобы один макро-атрибут добавлял неограниченно количество других макросов.
Проблемы могут быть только со стадиями. Не уверен, что компилятор сможет раскрыть макросы на той же стадии. Но на следующей по идее должен.
Скажем макрос может добавить атрибут [Record] к типу, что приведет к автоматическому формированию конструктора. Именно так делает компилятор для variant-ов.
http://nemerle.org/Banners/?g=dark
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.