Здравствуйте, VladD2, Вы писали:
VD>Здравствуйте, _nn_, Вы писали:
__>>В C# для создания констант используется const Type var, а в Nemerle static var : Type. __>>При чем если можно, то создается константа, а если нет то readonly. __>>Т.е. нельзя указать явно как в C# хотим мы const или readonly.
__>>Нигде, вроде, это не описано.
VD>Да, наверно нигде. Можешь помочь родине и добавить это описание в Вики.
Без проблем. http://nemerle.org/CsharpDiff
class A
{
readonly int readonlyA = 1;
int mutableA = 1;
const int constA = 1;
// staticstatic readonly int staticReadonlyA = 1;
static int staticMutableA = 1;
}
Nemerle
class A
{
/*readonly*/ readonlyA : int = 1; // OK
mutable mutableA : int = 1; // OK
/*const*/ constA : int = 1; // readonly, no const
// staticstatic/*readonly*/ staticReadonlyA : int = 1; // const int !static mutable staticMutableA : int = 1; // OKstatic/*readonly*/ staticReadonlyB : IPAddress = IPAddress.Parse("1"); // static readonly !
}
В C# для создания констант используется const Type var, а в Nemerle static var : Type.
При чем если можно, то создается константа, а если нет то readonly.
Т.е. нельзя указать явно как в C# хотим мы const или readonly.
Здравствуйте, _nn_, Вы писали:
__>В C# для создания констант используется const Type var, а в Nemerle static var : Type. __>При чем если можно, то создается константа, а если нет то readonly. __>Т.е. нельзя указать явно как в C# хотим мы const или readonly.
__>Нигде, вроде, это не описано.
Да, наверно нигде. Можешь помочь родине и добавить это описание в Вики.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
__>class A
__>{
__> readonly int readonlyA = 1;
__> int mutableA = 1;
__> const int constA = 1;
__> // static
__> static readonly int staticReadonlyA = 1;
__> static int staticMutableA = 1;
__>}
__>
__>Nemerle __>
__>class A
__>{
__> /*readonly*/ readonlyA : int = 1; // OK
__> mutable mutableA : int = 1; // OK
__> /*const*/ constA : int = 1; // readonly, no const
__> // static
__> static/*readonly*/ staticReadonlyA : int = 1; // const int !
__> static mutable staticMutableA : int = 1; // OK
__> static/*readonly*/ staticReadonlyB : IPAddress = IPAddress.Parse("1"); // static readonly !
__>}
__>
Связанные константы нужно объявлять следующим образом:
public module C {
public X : short = 10s;
public Y : short = C.X + 20s;
public Z : short = C.X * C.Y + 7s;
}
В этом случае все три объявления компилятор сочтет литералами и будет инлайнить их значения в местах использования (рефлектор при декомпиляции справедливо обзовет X, Y, Z константами).
Если же не писать префикс типа (C), то компилятор будет генерировать обращение к статическим полям.
Такой эффект обусловлен тем, что интерпретатор констант (ConstantFolder) для разрешения значений использует экземпляр GlobalEnv, который содержит информацию только об открытых пространствах имен без контекста текущего типа, потому и требуется полный квалификатор имени.
Здравствуйте, hardcase, Вы писали:
H>Еще дополню, интерпретатор констант не умеет работать с вещественными числами (float, double, decimal) и булевым типом.
Здравствуйте, _nn_, Вы писали:
__>Здравствуйте, hardcase, Вы писали:
H>>Еще дополню, интерпретатор констант не умеет работать с вещественными числами (float, double, decimal) и булевым типом.
__>Прескорбно. __>Nemerle: __>
Выбор конструктора decimal типа оттюнил в r8993, теперь константы decimal-ы изготавливаются без применения оружия массового поражения промежуточных массивов.
Здравствуйте, hardcase, Вы писали:
H>Порядок по-видимому важен. Ленивости нет — это же константы.
Это как раз не важно. Тут не ленивость нужна, а порядок определяемый ссылками.
Очень удобно если логика будет такой:
public module C
{
public Z : short = X * Y + 7s; // Так как значения X и Y еще неизвестны, пробуем вычислить их рекурсивно.public X : short = 10s;
public Y : short = X + 20s;
public D : short = F + 20s; // Так как значение F еще неизвестны, пробуем вычислить его рекурсивно.public F : short = D + 20s; // Циклическая ссылка! Выдаем сообщение об ошибке и прерываем вычисление (возвращая ноль).
}
Такое поведение очень удобно, так как позволяет независимость от порядка инициализации.
H>Если i-я константа не определена то будет изготовлено поле.
Этого не понял.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.