Как лучше выделять встроенный мета-код. Есть две проблемы. Мета-код может быть встроен в код мета-шаблонов (код используемый как основа для изменения работчего кода). И в мета-коде могут быть участки которые должны после некоторой модификации перенаситься в конечный код. Нужно как то выделять все это. Причем это выделение должно быть в рамках синтаксиса Шарпа, чтобы студия не ругалась на непонятный ей синтаксис.
Пока что на ум приходят следующие варианты:
1. Выделение некими конструкциями языка. Например, псевдо-методами:
BeginMetaCode();
// Этот код производит модификацию кода метода в который
// он встроен.foreach (RMemberPropertyImpl prop in meta.Propertys)
{
if (prop.Type.IsInheritedFrom("ICollection"))
{
BeginMetaEmit();// Это шаблон который переносится в конечный код.
// Методы начинающиеся с префикса "Meta" являются
// мета-методами. Они заменяются на некоторые языковые
// конструкции. Так MetaMakeRef заменяется ссылкой
// на свойство, описание которого передается в метод.
nodeCount += MetaMakeRef(prop).Count;
EndMetaEmit();
}
}
EndMetaCode();
2. Выделение атрибутами спрятанными в коментарии:
/*[MetaCode]*/foreach (RMemberPropertyImpl prop in meta.Propertys)
{
if (prop.Type.IsInheritedFrom("ICollection"))
{
/*[MetaEmit]*/
{
nodeCount += MetaMakeRef(prop).Count;
}
}
}
т.е. мета-атрибут распространяется на следующую инструкцию, в том числе на блок.
Какой синтаксис лучше? И чем? Если у кого есть свои варианты, то милости просим.
... << RSDN@Home 1.1.3 beta 2 >>
29.04.04 18:21: Перенесено модератором из 'RSDN Research' — VD
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, _FRED_, Вы писали:
_FR>Здравствуйте, VladD2, Вы писали:
VD>>... Если у кого есть свои варианты, ...
_FR>Может, на подобии деректив препроцессора?
В этом методе смущает наличие обязательных конструкций для начала и конца блока. Достаточно легко забыть закрыть блок, при этом никаких подсказок от студии ты не увидишь.
VD>2. Выделение атрибутами спрятанными в коментарии: VD>
Этот метод, в силу использования стандартных блоков — "{ ... }" — определенно лучше. Студия будет указывать на незакрытые блоки, а также помогать выравнивать код. Хотя, представляется проблемным:
1. В комментариях можно написать неправильную директиву и узнать об этом только на этапе компиляции.
2. Есть некое противоречие, что MetaCode и MetaEmit пишутся в комментариях, а MetaMakeRef выглядит как метод.
Может быть сделать фиктивный класс Meta и использовать такой синтаксис:
Здравствуйте, Андрей Майоров, Вы писали:
АМ> Вариант с препроцессорными директивами кажется неудачным из-за того, как студия форматирует их в коде. Нифига не наглядно.
А если так:
#region meta code
foreach (RMemberPropertyImpl prop in meta.Propertys)
{
if (prop.Type.IsInheritedFrom("ICollection"))
{
#region meta emit
{
nodeCount += MetaMakeRef(prop).Count;
}
#endregion
}
}
#endregion
Здравствуйте, _FRED_, Вы писали:
VD>>... Если у кого есть свои варианты, ...
_FR>Может, на подобии деректив препроцессора?
Не пойдет. Нужно чтобы это дело вписывалось в синтаксис языка. Мначе его невозможно представить в синтаксическом дереве. (препроцессор выкидывается на начальном этапе).
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, Андрей Майоров, Вы писали:
АМ> В этом методе смущает наличие обязательных конструкций для начала и конца блока. Достаточно легко забыть закрыть блок, при этом никаких подсказок от студии ты не увидишь.
От студии нет. Но сам R# обязательно напомнит об этом, так как закрывающая конструкция обязана быть в том же блоке, что и открывающая.
АМ> Этот метод, в силу использования стандартных блоков — "{ ... }" — определенно лучше. Студия будет указывать на незакрытые блоки, а также помогать выравнивать код. Хотя, представляется проблемным: АМ> 1. В комментариях можно написать неправильную директиву и узнать об этом только на этапе компиляции. АМ> 2. Есть некое противоречие, что MetaCode и MetaEmit пишутся в комментариях, а MetaMakeRef выглядит как метод.
АМ> Может быть сделать фиктивный класс Meta и использовать такой синтаксис: АМ>
АМ> Тогда получим полную поддержку от студии и в смысле подсветки синтаксиса и в смысле подсказок (если подключить соотв. сборку при разработке).
АМ> Вариант с препроцессорными директивами кажется неудачным из-за того, как студия форматирует их в коде. Нифига не наглядно.
Да, пожалуй using — это то что нужно. Я тоже думал о шататной конструкции, но в голову приходили только while-ы и if-ы. Видимо старею.
using приятен еще и тем, что его можно применять без фигурных скобок: