Closed prospero78 closed 5 years ago
Без примера кода не очень понятно. Алиас -- это точно тот же тип, только с другим названием. И это тоже следует из описания. Приведение не нужно.
Сомневаюсь, что поведение правильное. Алиас для килограммов/штук для того и вводится, чтобы нельзя было их свободно складывать. Если алиасы это разрешают -- зачем тогда их вообще вводить? Чтобы ослабить надёжность? Не похоже такое на Вирта.
Oberon-07/16:
8.2.2. Arithmetic operators ... The operators +, −, *, and / apply to operands of numeric types. Both operands must be of the same type, which is also the type of the result. When used as unary operators, − denotes sign inversion and + denotes the identity operation.
9.1. Assignments ... The type of the expression must be the same as that of the designator. ...
Однако, что такое "Same types" в репорте не написано.
Определение есть в репорте Oberon-2:
Same types Two variables a and b with types Ta and Tb are of the same type if
Ta and Tb are both denoted by the same type identifier, or Ta is declared to equal Tb in a type declaration of the form Ta = Tb, or a and b appear in the same identifier list in a variable, record field, or formal parameter declaration and are not open arrays.
Oberon-2 -- это, конечно, другой язык, но Вирт является соавтором этого языка. Точно так же ведет себя и КП, и другие известные мне реализации Оберона-07. Я считаю, что алиасы введены только для сокращения записи, как в Обероне-2/КП. Нет оснований считать, что Оберон-07 надежнее других диалектов Оберона.
Оберон-07 надёжней. Хотя бы потому, что он меньше, и типов в нём меньше, и вообще он меньше)) https://docs.google.com/document/d/1qcldcIVZ0SfBPa7IS3D_Ty35mki1YeCcB2N2CXrv9Fo/edit?usp=sharing -- специально смотрел в репорт Оберон-07 -- там нет определения, что ты привёл, так что, по дефолту можно предположить, что приведённое тобой описание верно, но предполагаю, что нет.
Ну, если покопаться в репорте, то можно найти немало мест, допускающих разное толкование. Если язык описать как можно полнее, то получится не 17, а 117, а может 517 страниц. Для разработчика реализации здесь возможны такие варианты:
1) спросить у Вирта 2) посмотреть реализацию от Вирта 3) посмотреть другие реализации (в том числе и других диалектов) 4) придумать свое
Для меня, наиболее доступный и удобный пункт 3. Иногда делаю по-своему (пункт 4), в тех случаях, когда я не согласен с другими реализациями. Например, проверка/охрана типа нулевого указателя:
num := list.first(Int);
WHILE num # NIL DO
Out.Int(num.x, 0); Out.Ln;
num := num.next(Int)
END
Здесь, в последней итерации цикла (num.next = NIL), будет трап в ББ и во многих реализациях Оберона. В моей реализации будет просто завершение цикла по условию. Такая особенность существует давно, она прошла проверку на практике и не снижает безопасность.
Репорт не описывает как нужно делать Оберон для конкретной машины. Это некий общий профиль, мета-модель. А детали реализации остаются на совести реализатора конкретного варианта Оберона.
При попытке создать алиас INTEGER и использовать его в присвоении -- присвоение происходит без приведения алиаса к INTEGER.