Nemerle Enhancement Proposal 1
Проблема:
В C# и в Nemerle мы имеем возможность определить свойства похожим образом включая автосвойства.
Но ни в C# ни в Nemerle нет возможности задать в автосвойстве только getter. (или только setter, кому оно надо не знаю
)
Для этой цели в C# надо писать поле и свойство, а в Nemerle можно сократить работу за счет макроатрибута:
_i : int;
I : int { get { _i } };
mutable _j : int;
J : int { get { _j } set { _j = value } };
mutable _k : int;
K : int { set { _k = value } };
[Accessor]
_i : int;
[Accessor(WantSetter = true)]
_j : int;
Accessor неинтуитивен для программистов C#.
Предложение:
Вместо этого предлагаю обратный Accessor-у стиль.
Описываем свойство, а поле генерируется по имени свойства:
I : int { get };
// _i : int;
// I : int { get { _i } };
[MutableField] I : int { get };
// mutable _i : int;
// I : int { get { _i } };
J : int { get; set; };
// mutable _j : int;
// J : int { get { _j } set { _j = value } };
K : int { set };
// mutable _k : int;
// K : int { set { _k = value } };
Не нужен сложный атрибут Accessor, код более понятен.
Также это не ломает старый код, а лишь дополняет функционал.
Если имя уже занято, ошибка компиляции.
Приложение:
Таким образом можно и улучшить variant.
Вместо задавания полей, можно задавать свойства с генерируемыми полями:
Старый вариант:
variant A
{
| X
{
i : int; j : int; // Определение полей
public new this(i : int, j : int)
{
this.i = i;
this.j = j;
}
}
| Y
{
K : int; L : int; // Определение полей
public new this(k : int, l : int)
{
this.K = k;
this.L = l;
}
}
}
def x = A.X(1, 2);
def i = x.i;
def j = x.j;
def y = A.Y(1, 2);
def k = y.K;
def l = y.L;
Новый вариант:
variant A
{
| X
{
// Создаются поля _i, _j
i : int; j : int; // Определение свойств
public new this(i : int, j : int)
{
this._i = i;
this._j = j;
}
}
| Y
{
// Создаются поля _k, _l
K : int; L : int; // Определение свойств
public new this(k : int, l : int)
{
this._k = k;
this._l = l;
}
}
}
def x = A.X(1, 2);
def i = x.i;
def j = x.j;
def y = A.Y(1, 2);
def k = y.K;
def l = y.L;
Заключение:
Предложенный способ позволит улучшить код и привлечь больше программистов C#.
Изменение variant улучшает взаимодействие с C#.
Высказываемся