Как должен выглядить inline-meta-code?
От: VladD2 Российская Империя www.nemerle.org
Дата: 28.04.04 12:14
Оценка:
Как лучше выделять встроенный мета-код. Есть две проблемы. Мета-код может быть встроен в код мета-шаблонов (код используемый как основа для изменения работчего кода). И в мета-коде могут быть участки которые должны после некоторой модификации перенаситься в конечный код. Нужно как то выделять все это. Причем это выделение должно быть в рамках синтаксиса Шарпа, чтобы студия не ругалась на непонятный ей синтаксис.

Пока что на ум приходят следующие варианты:
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
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re: Как должен выглядить inline-meta-code?
От: _FRED_ Черногория
Дата: 29.04.04 03:24
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>... Если у кого есть свои варианты, ...


Может, на подобии деректив препроцессора?
Help will always be given at Hogwarts to those who ask for it.
Re[2]: Как должен выглядить inline-meta-code?
От: _FRED_ Черногория
Дата: 29.04.04 03:31
Оценка:
Здравствуйте, _FRED_, Вы писали:

_FR>Здравствуйте, VladD2, Вы писали:


VD>>... Если у кого есть свои варианты, ...


_FR>Может, на подобии деректив препроцессора?


Нападобии (ну дайте помечтать )
#metaemit
foreach (RMemberPropertyImpl prop in meta.Propertys)
{
        if (prop.Type.IsInheritedFrom("ICollection"))
        {
#metaemit [SomeParam1, SomeParam2] [SomeParam3()]
                {
                    nodeCount += MetaMakeRef(prop).Count;
                }
#endmetaemit
        }
}
#endmetaemit
Help will always be given at Hogwarts to those who ask for it.
Re: Как должен выглядить inline-meta-code?
От: Андрей Майоров Россия http://blogs.byte-force.com/xor
Дата: 29.04.04 07:46
Оценка: 60 (2)
Здравствуйте, VladD2, Вы писали:

VD>1. Выделение некими конструкциями языка. Например, псевдо-методами:

VD>
VD>BeginMetaCode();
VD>...
VD>  BeginMetaEmit();
VD>...
VD>  EndMetaEmit();
VD>...
VD>EndMetaCode();
VD>


В этом методе смущает наличие обязательных конструкций для начала и конца блока. Достаточно легко забыть закрыть блок, при этом никаких подсказок от студии ты не увидишь.

VD>2. Выделение атрибутами спрятанными в коментарии:

VD>
VD>/*[MetaCode]*/
VD>...
VD>{
VD>...
VD>  /*[MetaEmit]*/
VD>  {
VD>    nodeCount += MetaMakeRef(prop).Count;
VD>  }
VD>}
VD>


Этот метод, в силу использования стандартных блоков — "{ ... }" — определенно лучше. Студия будет указывать на незакрытые блоки, а также помогать выравнивать код. Хотя, представляется проблемным:
1. В комментариях можно написать неправильную директиву и узнать об этом только на этапе компиляции.
2. Есть некое противоречие, что MetaCode и MetaEmit пишутся в комментариях, а MetaMakeRef выглядит как метод.

Может быть сделать фиктивный класс Meta и использовать такой синтаксис:
using( Meta.Emit( ))
{
    nodeCount += Meta.MakeRef(prop).Count;
}


Тогда получим полную поддержку от студии и в смысле подсветки синтаксиса и в смысле подсказок (если подключить соотв. сборку при разработке).

Вариант с препроцессорными директивами кажется неудачным из-за того, как студия форматирует их в коде. Нифига не наглядно.

WBR,
XOR // BYTE-force
... << RSDN@Home 1.1.3 stable >>
WBR,
XOR // BYTE-force
Re[2]: Как должен выглядить inline-meta-code?
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 29.04.04 08:21
Оценка: +1
Здравствуйте, Андрей Майоров, Вы писали:

АМ> Вариант с препроцессорными директивами кажется неудачным из-за того, как студия форматирует их в коде. Нифига не наглядно.


А если так:

#region meta code
foreach (RMemberPropertyImpl prop in meta.Propertys)
{
        if (prop.Type.IsInheritedFrom("ICollection"))
        {
                                #region meta emit
                {
                    nodeCount += MetaMakeRef(prop).Count;
                }
                                #endregion
        }
}
#endregion
... << RSDN@Home 1.1.3 stable >>
AVK Blog
Re[2]: Как должен выглядить inline-meta-code?
От: VladD2 Российская Империя www.nemerle.org
Дата: 29.04.04 12:28
Оценка:
Здравствуйте, _FRED_, Вы писали:

VD>>... Если у кого есть свои варианты, ...


_FR>Может, на подобии деректив препроцессора?


Не пойдет. Нужно чтобы это дело вписывалось в синтаксис языка. Мначе его невозможно представить в синтаксическом дереве. (препроцессор выкидывается на начальном этапе).
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[3]: Как должен выглядить inline-meta-code?
От: VladD2 Российская Империя www.nemerle.org
Дата: 29.04.04 12:51
Оценка:
Здравствуйте, AndrewVK, Вы писали:

AVK>А если так:


Так не катит. Нужны именно синтаксические конструкции.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[2]: Как должен выглядить inline-meta-code?
От: VladD2 Российская Империя www.nemerle.org
Дата: 29.04.04 12:58
Оценка: +1
Здравствуйте, Андрей Майоров, Вы писали:

АМ> В этом методе смущает наличие обязательных конструкций для начала и конца блока. Достаточно легко забыть закрыть блок, при этом никаких подсказок от студии ты не увидишь.


От студии нет. Но сам R# обязательно напомнит об этом, так как закрывающая конструкция обязана быть в том же блоке, что и открывающая.

АМ> Этот метод, в силу использования стандартных блоков — "{ ... }" — определенно лучше. Студия будет указывать на незакрытые блоки, а также помогать выравнивать код. Хотя, представляется проблемным:

АМ> 1. В комментариях можно написать неправильную директиву и узнать об этом только на этапе компиляции.
АМ> 2. Есть некое противоречие, что MetaCode и MetaEmit пишутся в комментариях, а MetaMakeRef выглядит как метод.

АМ> Может быть сделать фиктивный класс Meta и использовать такой синтаксис:

АМ>
АМ>using( Meta.Emit( ))
АМ>{
АМ>    nodeCount += Meta.MakeRef(prop).Count;
АМ>}
АМ>


АМ> Тогда получим полную поддержку от студии и в смысле подсветки синтаксиса и в смысле подсказок (если подключить соотв. сборку при разработке).


АМ> Вариант с препроцессорными директивами кажется неудачным из-за того, как студия форматирует их в коде. Нифига не наглядно.


Да, пожалуй using — это то что нужно. Я тоже думал о шататной конструкции, но в голову приходили только while-ы и if-ы. Видимо старею.

using приятен еще и тем, что его можно применять без фигурных скобок:

using(Meta.Emit())
    nodeCount += Meta.MakeRef(prop).Count;
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.