ForceIntType
От: VladD2 Российская Империя www.nemerle.org
Дата: 28.10.11 15:15
Оценка: +1
Разбираясь с вот этим случаем, нарвался на любопытную функцию в компиляторе — ForceIntType.

Ее смысл заключается в том, что для встроенных операторов (&, +, и т.п.), операндами которых являются типы меньшие нежели int, задается возвращаемый тип int.

По всей видимости поляки пытались реализовать одну из фич C#-а, при этом не особо задумываясь над тем нужно ли это делать или нет.

Поддержка данной фичи приводит к вот таким вот казусам:
    def b : byte = 1;
    def _ul : ulong =  b & 0x7FUL;

данный код не компилируется с сообщением об ошибке "немогу привести int к ulong).

Казалось бы тип второго операнда задан как UL и должна выбраться версия оператора & с типом ulong * ulong -> ulong, но умный код разрешения перегрузки видит что значение второго операнда — это константа которая влезает в byte и выбирает перегрузку byte * byte -> int.

А вот, выделенный жирным, int появляется в следствии работы ForceIntType.

Данная неопрятность вылезает и во множестве других мест. Это вызывает некоторые проблемы при использовании стандартных операторов над встроенными типами размер которых меньше int.

C# не имеет подобных проблем, так как в нем допускается ряд небезопасных не явных приведений от int.

Я провел смелый научный эксперимент и закоментировал тело тело функции ForceIntType:
  protected static ForceIntType (name : string) : void
  {
    _ = name;
    /*
    match (special_members [name]) {
      | [elem is IMethod] =>
        assert (InternalType.Int32 != null);
        def hd = elem.GetHeader ();
        hd.ReturnType = InternalType.Int32;
      | _ => assert (false)
    }
    */
  }

Никаких проблем это не создало и компилятор вместе с тестами спокойно собрался по двухпроходной схеме.

Собственно вопрос в том есть ли смысл в этом чуде нечеловеческой мысли? Может убрать этот ForceIntType?
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re: ForceIntType
От: catbert  
Дата: 28.10.11 15:19
Оценка: 1 (1) +1
Здравствуйте, VladD2, Вы писали:

VD>Собственно вопрос в том есть ли смысл в этом чуде нечеловеческой мысли? Может убрать этот ForceIntType?


Хуже, чем сейчас, все равно не станет. Лично я за упрощение работы с целыми.
Re[2]: ForceIntType
От: VladD2 Российская Империя www.nemerle.org
Дата: 28.10.11 16:24
Оценка:
Здравствуйте, catbert, Вы писали:

VD>>Собственно вопрос в том есть ли смысл в этом чуде нечеловеческой мысли? Может убрать этот ForceIntType?


C>Хуже, чем сейчас, все равно не станет. Лично я за упрощение работы с целыми.


Другие мнения есть?

В общем, тема повесит какое-то время. Если появятся мысли — отвечейте. Если ответов не последует я удаляю этот ForceIntType.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re: ForceIntType
От: VladD2 Российская Империя www.nemerle.org
Дата: 01.11.11 10:44
Оценка:
Здравствуйте, VladD2, Вы писали:

В общем, отрубил эту ForceIntType. Будем использовать новый вариант некоторое время в тестовом режиме.

О появившихся проблемах, просьба, сообщать сюда.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.