Здравствуйте, VladD2, Вы писали:
VD>Ну, как? Что-нибудь получается? Если есть вопросы, то лучше их задавать заранее
Вопросы относительно проекта Core:
Класс NMemberInfo абстрактный, но не содержит не то что абстрактных, а даже виртуальных методов. Все-таки его свойства и методы должны быть абстрактными?
Возможно в проекте Core должны быть также соответствующие абстрактные классы: NPropertyInfo, NFieldInfo, NEventInfo, NMethodInfo ?
в файле IMember.n опечатка: должно быть CustomAttributes вместо CastomAttributes
PS. Я могу сделать эти изменения в основной ветке, или в своем клоне
Здравствуйте, _Eter_, Вы писали:
_E_>Я имел ввиду нужно ли в названии проекта отразить, что это реализация чтения метаданных на основе базовой библиотеки cci?
А, да... это можно. Можно назвать ее MetadataReader.CCI.
_E_>Ранее вроде бы говорилось, что предполагается реализовать чтение метаданных на основе разных базовых библиотек, одна из которых cci. Будут ли все эти реализации находиться в одной сборке, или для каждой все-таки нужна своя сборка.
Конечно логично было бы чтобы они находились в отдельных сборках.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, _Eter_, Вы писали:
_E_>Вопросы относительно проекта Core:
_E_> * Класс NMemberInfo абстрактный, но не содержит не то что абстрактных, а даже виртуальных методов. Все-таки его свойства и методы должны быть абстрактными?
Делай пока виртуальными. В принципе большую их часть можно реализовать прямо в этом классе. В принципе класс не очень то и нужен. Он ведь только интерфейс реализует.
_E_> * Возможно в проекте Core должны быть также соответствующие абстрактные классы: NPropertyInfo, NFieldInfo, NEventInfo, NMethodInfo?
Да проще, наверно, реализовывать интерфейсы напрямую. Хотя, если в реализациях будет общий код, то можно поступить и так.
_E_>в файле IMember.n опечатка: должно быть CustomAttributes вместо CastomAttributes
Сейчас поправим.
_E_>PS. Я могу сделать эти изменения в основной ветке, или в своем клоне
CastomAttributes — я уже поправил. Так что просто обновись. Остальное меняй как тебе надо. Если что потом отрефакторим.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, Jack128, Вы писали:
J>Здравствуйте, VladD2, Вы писали:
J>каков смысл типа Nemerle2.Compiler.Subst?
Это тип используемый для подстановки параметров типов. Он позволяет заменить одни параметры типов другими. Пример его применения можно найти в комите 9508 (файл Typer.n). Там Subst используется для замены параметров типа алиаса (создаваемых директивой "type") на явно заданный список типов.
J>и на счет свойства NTypeInfo.AttributeTargets , я так понимаю — это свойство имеет смысл только для наследников System.Attribute ?
По всей видимости — да.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, VladD2, Вы писали:
VD>Так же прошу всех кто хочет работать над этой фичей скоординировать работу друг с другом. VD>Лучше всего было бы организовать общественный чат в Скайпе где и обсуждать все возникающие проблемы и идеи.
Как бы скоординировать работу? Мне сейчас не очень понятно, как работать: начал я что-то делать в своем клоне, а два других человека начали делать в своих, какой смысл нам делать одну и ту же работу?
Здравствуйте, VladD2, Вы писали:
VD>Здравствуйте, _Eter_, Вы писали:
_E_>>На ревизии 5f2b02224b улетает ncc.exe
VD>Что значит "улетает"?
Происходит необработанное исключение. Причина видимо была в том, что у меня получились установлены две версии Nemerle: бета и RC. После того как я их обе снес и заново поставил только RC все заработало
Оптимально было бы связаться в одно и то же время по скайпу и обсудить детали. Просьба отписать в указанной ветке удобно ли обсуждать по скайпу и если да, то во сколько тебе будет удобнее.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Для начала личная просьба, занести в гугль-эканут информацию о рсдн-овском экаунте и наоборот. А то приходится искать корреляцию через поиск в почте. Тоже самое касается скайповского экаунта.
_E_>Как бы скоординировать работу?
Да, конечно.
_E_>Мне сейчас не очень понятно, как работать: начал я что-то делать в своем клоне, а два других человека начали делать в своих, какой смысл нам делать одну и ту же работу?
Как я понял реально CCI-ем занялись двое, ты и Jack128. Лучше всего будет пересечься по скайпу и обсудить детали. Если через скайп сложно, то можно и здесь все обсудить. Я уже отписал
Здравствуйте, _Eter_, Вы писали:
_E_>Как бы скоординировать работу? Мне сейчас не очень понятно, как работать: начал я что-то делать в своем клоне, а два других человека начали делать в своих, какой смысл нам делать одну и ту же работу?
Я потихонечку начну смотреть что вы оба уже успели сделать и выдавать отдельные замечания.
Здравствуйте, Jack128, Вы писали:
J>каков смысл типа Nemerle2.Compiler.Subst ? J>и на счет свойства NTypeInfo.AttributeTargets , я так понимаю — это свойство имеет смысл только для наследников System.Attribute ?
Посмотрел твой код. Есть несколько замечаний.
1. Классы реализации нужно поместить в отдельный проект (а не держать их в Core).
2. В тестах (да и вообще нигде) нельзя использовать полные пути. В качестве тестовых сборок используй Nemerle*.dll. Путь к ним получай программно, через переменные среды расширения. Если орпеделена переменная "%Nemerle%", то бери путь в ней, если нет, то используй "%ProgramFiles%\Nemerle". На всякий случай.... их резолв делается с помощью System.Environment.GetEnvironmentVariable().
3. В проекте периодически попадаются табуляции. Это не хорошо. В других местах отбивки делаются четырьмя (4) пробелами. Надо использовать два (2).
4. Используются неверные переносы операторов. Бинарные операторы переносятся на следующую строку. При указании типов надо ставить пробел как перед двоеточием, так и после него, т.е. не так "_host: SomeType", а так "_host : SomeType". В общем, внимательно прочти правила форматирвоания.
5. Значения лучше вычислять не в свойствах, а в конструкторах. Вычисляем значения свойств в свойствах, только если они возвращают большие объемы данных загрузку которых имеет смысл отсрочить. Обычно такие свойства имеют тип Seq[_]. Так значение свойства IsNumeric лучше вычислить в конструкторе (или при первом обращении и запомнить в поле).
6. По поводу свойства IReferencedAssembly.Types:
public Types : Seq[NTypeInfo]
{
get
{
def types = _assembly.GetAllTypes();
types.Map(CciNTypeInfo(_));
}
}
6.2. Полученный список нужно кэшировать, а не создавать при каждом запросе значения свойства. Это во-первых, расточительно, и во-вторых, будет создавать множество экземпляров оберток (CciNTypeInfo) для одного и того же типа, а этого лучше избежать. Для материализации списков большого размера лучше всего использовать privat-копии массивов. Ссылки на такие массивы ни в коем случае не отдавать наружу. Вместо этого нужно возвращать отдельный перечислитель (Seq).
6.2. Хот в данном случае список все равно нужно материализовать, но в общем случае, если свойство возвращает Seq, вычисление его значения нужно стараться отложить. Стало быть здесь нужно примерять не Map(), а MapLazy() или линковский Select(). Еще раз подчеркну, что в данном случае список все равно нужно материализовать.
6.3. Если не ошибаюсь, метод GetAllTypes() возвращает все типы. В том числе и вложенные. Нам же нужно возвращать только типы объявленные в пространствах имен (т.е. типы верхнего уровня). Вложенные типы должны быть доступны через соответствующие свойства NTypeInfo. Возможно потом мы добавим дополнительное свойство выдающее все типы. Но Types должен возвращать только верхнеуровневые.
Ну, и общее замечание по CCI. Работать с их интерфейсами напрямую обычно очень сложно и неудобно. Для облегчении жизни авторы CCI создали ряд классов-помощников. Например, TypeHelper для упрощения работы с типами. Вот список хэлперов выявленный поиском по следующему регуляроному выражению "class :iHelper":
* TypeHelper
* MemberHelper
* AttributeHelper
* ClrHelper
* UnitHelper
* MutableModelHelper
--------- нижеприведенные, видимо, к делу не относятся ---------
* HashHelper
* IteratorHelper
* ObjectModelHelper
Их имена говорят сами за себя. Просто открой солюшен Metadata.sln и посмотри описания их методов.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, VladD2, Вы писали:
VD>3. В проекте периодически попадаются табуляции. Это не хорошо. В других местах отбивки делаются четырьмя (4) пробелами. Надо использовать два (2).
Может в 2011-м году проще купить широкоформатный монитор?
Если нам не помогут, то мы тоже никого не пощадим.
Здравствуйте, IT, Вы писали:
VD>>3. В проекте периодически попадаются табуляции. Это не хорошо. В других местах отбивки делаются четырьмя (4) пробелами. Надо использовать два (2).
IT> Может в 2011-м году проще купить широкоформатный монитор?
Ты сегодня не с той ноги встал?
Есть правила форматирования кода и их нужно выполнять не смотря на вероисповедание, размер монитора и прочих прелестей. Большинство высказалось за 2 пробела, значит так тому и быть.
ЗЫ
Что до мониторов, то с ноутбуком монитор таскать не будешь. Да и монитор тут не причем. Немерл располагает к написанию кода "в строку". Провоцировать бессмысленное удлинение строк нет смысла. Раз выбрали проблемы, то их будет ровно два.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, VladD2, Вы писали:
VD>Есть правила форматирования кода и их нужно выполнять не смотря на вероисповедание, размер монитора и прочих прелестей. Большинство высказалось за 2 пробела, значит так тому и быть.
А где на них можно посмотреть?
VD>Что до мониторов, то с ноутбуком монитор таскать не будешь. Да и монитор тут не причем. Немерл располагает к написанию кода "в строку". Провоцировать бессмысленное удлинение строк нет смысла. Раз выбрали проблемы, то их будет ровно два.
А четыре обсуждали?
Если нам не помогут, то мы тоже никого не пощадим.
Здравствуйте, IT, Вы писали:
VD>>Есть правила форматирования кода и их нужно выполнять не смотря на вероисповедание, размер монитора и прочих прелестей. Большинство высказалось за 2 пробела, значит так тому и быть.
IT>А где на них можно посмотреть?