Начали писать серию статей по NemerleWeb, и там понадобился макрос, который сделал бы объявление типов более лаконичными.
Первый пример — это классический todo список. Для такого списка неплохо было бы создать тип:
public class Task
{
public Name : string { get; set; }
public Priority : string { get; set; }
public IsDone : bool { get; set; }
}
Так как тип хотелось бы уместить внутри Unit (класс с логикой и разметкой), то получается чересчур многословно. Опять же вспоминаем одну из целей проекта — "максимальная лаконичность".
Предложение:
[Dto] class Task { Name : string; Priority : string; IsDone : bool }
По умолчанию Dto конвертирует эти поля в свойства и добавляет модификатор public. Так же создаётся конструктор, инициализирующий все поля (упрощённый вариант [Record])
Возможные опции:
[Dto(fields)] — поля остаются полями, но они мутабельные
[Dto(fields, immutable)] — поля остаются иммутабельными
[Dto(immutable)] — свойства, иммутабельные (private set)
Здравствуйте, ionoy, Вы писали:
I>[Dto(fields)] — поля остаются полями, но они мутабельные I>[Dto(fields, immutable)] — поля остаются иммутабельными I>[Dto(immutable)] — свойства, иммутабельные (private set)
А может лучше наоборот, по умолчанию сделать иммутабельность?
Здравствуйте, ionoy, Вы писали:
I>Начали писать серию статей по NemerleWeb, и там понадобился макрос, который сделал бы объявление типов более лаконичными.
I>Первый пример — это классический todo список. Для такого списка неплохо было бы создать тип: I>
I>public class Task
I>{
I> public Name : string { get; set; }
I> public Priority : string { get; set; }
I> public IsDone : bool { get; set; }
I>}
I>
I>Так как тип хотелось бы уместить внутри Unit (класс с логикой и разметкой), то получается чересчур многословно. Опять же вспоминаем одну из целей проекта — "максимальная лаконичность".
I>Предложение: I>
I>[Dto] class Task { Name : string; Priority : string; IsDone : bool }
I>
I>По умолчанию Dto конвертирует эти поля в свойства и добавляет модификатор public. Так же создаётся конструктор, инициализирующий все поля (упрощённый вариант [Record])
I>Возможные опции:
I>[Dto(fields)] — поля остаются полями, но они мутабельные I>[Dto(fields, immutable)] — поля остаются иммутабельными I>[Dto(immutable)] — свойства, иммутабельные (private set)
Здравствуйте, ionoy, Вы писали:
I>Начали писать серию статей по NemerleWeb, и там понадобился макрос, который сделал бы объявление типов более лаконичными.
I>Первый пример — это классический todo список. Для такого списка неплохо было бы создать тип: I>
I>public class Task
I>{
I> public Name : string { get; set; }
I> public Priority : string { get; set; }
I> public IsDone : bool { get; set; }
I>}
I>
I>Так как тип хотелось бы уместить внутри Unit (класс с логикой и разметкой), то получается чересчур многословно. Опять же вспоминаем одну из целей проекта — "максимальная лаконичность".
I>Предложение: I>
I>[Dto] class Task { Name : string; Priority : string; IsDone : bool }
I>
I>По умолчанию Dto конвертирует эти поля в свойства и добавляет модификатор public. Так же создаётся конструктор, инициализирующий все поля (упрощённый вариант [Record])
I>Возможные опции:
I>[Dto(fields)] — поля остаются полями, но они мутабельные I>[Dto(fields, immutable)] — поля остаются иммутабельными I>[Dto(immutable)] — свойства, иммутабельные (private set)
Можно как то так:
[Dto( Name, Priority : string, IsDone : bool)] class Task {}
//[] - свойства
//+ - мутабельные
[Dto( [Name] = "X", Priority : string, +IsDone : bool)] class Task {}
public class Task
{
public Name : string { get; default { "X" } }
public Priority : string ;
public mutable IsDone : bool ;
}
Здравствуйте, Аноним, Вы писали:
I>>Это уже какой-то язык в языке получается. Имхо слишком сложно для такой просто задачи.
А>Наоборот нормально.
А>вспомним regexp А>тоже язык в языке.
Ну так и задачу он решает несравнимо более сложную.
Здравствуйте, ionoy, Вы писали:
I>Начали писать серию статей по NemerleWeb, и там понадобился макрос, который сделал бы объявление типов более лаконичными.
Как показала практика такой макрос не выходит написать в рамках системы Nemerle.
Дело в том, что порядок макросов не определен, а значит один макрос увидит приватное поле, а другой может увидеть публичное и будет работать не так как надо.
Здравствуйте, _NN_, Вы писали:
_NN>Здравствуйте, ionoy, Вы писали:
I>>Начали писать серию статей по NemerleWeb, и там понадобился макрос, который сделал бы объявление типов более лаконичными.
_NN>Как показала практика такой макрос не выходит написать в рамках системы Nemerle. _NN>Дело в том, что порядок макросов не определен, а значит один макрос увидит приватное поле, а другой может увидеть публичное и будет работать не так как надо.
_NN>Есть идеи ?