Автор Тема: [Oberon-07/11] Правила присваиваний.  (Прочитано 6529 раз)

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
[Oberon-07/11] Правила присваиваний.
« : Октябрь 30, 2012, 10:02:13 am »
В сообщении о языке про присваивания сказано:
Цитировать
The type of the expression must be the same as that of the designator. The following exceptions hold:
1. The constant NIL can be assigned to variables of any pointer or procedure type.
2. Strings can be assigned to any array of characters, provided the number of characters in the
string is not greater than that of the array. If it is less, a null character (0X) is appended. Singlecharacter strings can also be assigned to variables of type CHAR.
3. In the case of records, the type of the source must be an extension of the type of the destination

Я правильно понимаю, что в результате следующее присваивание не валидно?
VAR
   a : LONGREAL;
   b : REAL;
BEGIN
   a := b;
END;
Y = λf.(λx.f (x x)) (λx.f (x x))

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Re: [Oberon-07/11] Правила присваиваний.
« Ответ #1 : Октябрь 30, 2012, 10:07:54 am »
Да, и похоже, что следующее тоже нельзя:
VAR
   a : LONGREAL;
BEGIN
   a := 42;
END;
Y = λf.(λx.f (x x)) (λx.f (x x))

Geniepro

  • Hero Member
  • *****
  • Сообщений: 1955
  • Знайте- истина в том, что повторено трижды подряд!
    • Просмотр профиля
Re: [Oberon-07/11] Правила присваиваний.
« Ответ #2 : Октябрь 30, 2012, 10:25:52 am »
Первый пример абсолютно невалиден, а вот второй пример -- почему бы и нет? Или литерал 42 обязан быть целого типа?
to iterate is human, to recurse, divine

Салат «рекурсия»: помидоры, огурцы, салат…

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Re: [Oberon-07/11] Правила присваиваний.
« Ответ #3 : Октябрь 30, 2012, 10:34:05 am »
Или литерал 42 обязан быть целого типа?

Да

Цитировать
Numbers are (unsigned) integers or real numbers. Integers are sequences of digits and may be
followed by a suffix letter. If no suffix is specified, the representation is decimal. The suffix H
indicates hexadecimal representation.

A  real number always contains a decimal point. Optionally it may also contain a decimal scale
factor. The letter E is pronounced as  "times ten to the power of". A real number is of type REAL,
unless it contains a scale factor with the letter D, in which case it is of type LONGREAL.
Y = λf.(λx.f (x x)) (λx.f (x x))

Geniepro

  • Hero Member
  • *****
  • Сообщений: 1955
  • Знайте- истина в том, что повторено трижды подряд!
    • Просмотр профиля
Re: [Oberon-07/11] Правила присваиваний.
« Ответ #4 : Октябрь 30, 2012, 01:01:54 pm »
Ну значит надо писать так:
VAR
   a : LONGREAL;
BEGIN
   a := 42.0D;
END;
С другой строны, может так и правильнее -- сразу понятно, что a -- переменная вещественного типа...
Хотя приписывать D неудобно, конечно...
to iterate is human, to recurse, divine

Салат «рекурсия»: помидоры, огурцы, салат…

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Re: [Oberon-07/11] Правила присваиваний.
« Ответ #5 : Октябрь 30, 2012, 03:43:54 pm »
Гм. И, похоже, что если четко следовать букве закона из сообщения о языке, то имеем также следующее:
TYPE
   A = RECORD END;
   B = RECORD (A) END;
   PA = POINTER TO A;
   PB = POINTER TO B;
VAR
   a : A;
   b : B;
   pa : PA;
   pb : PB;
BEGIN
   a := b; (* ok *)
   pa := pb; (* error, ибо PA&PB - это не записи *)
END
Y = λf.(λx.f (x x)) (λx.f (x x))

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Re: [Oberon-07/11] Правила присваиваний.
« Ответ #6 : Октябрь 30, 2012, 04:00:29 pm »
Замечу, что это место в Обероне-07/11 отличается от того что в Обероне-89/90. Там было так:

Цитировать
The type of the expression must be included by the type of the variable, or it must extend the type
of the variable.

А стало так:
Цитировать
The type of the expression must be the same as that of the designator.

То есть если раньше у типов была иерархия (одни в другие включались), то теперь все, никакой иерархии, типы должны точно совпадать во всех случаях, кроме RECORD-типов и массивов символов. Указатели, всякие численные типы и так далее, теперь в пролете.
Y = λf.(λx.f (x x)) (λx.f (x x))

Berserker

  • Sr. Member
  • ****
  • Сообщений: 254
    • Просмотр профиля
Re: [Oberon-07/11] Правила присваиваний.
« Ответ #7 : Октябрь 30, 2012, 04:01:48 pm »
А разве
Цитировать
3. In the case of records, the type of the source must be an extension of the type of the destination
не подходит к предыдущему сообщению?

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Re: [Oberon-07/11] Правила присваиваний.
« Ответ #8 : Октябрь 30, 2012, 04:05:15 pm »
А разве
Цитировать
3. In the case of records, the type of the source must be an extension of the type of the destination
не подходит к предыдущему сообщению?
Нет. В сообщении о языке явно различают тип указателя на запись и сам тип-запись.
Y = λf.(λx.f (x x)) (λx.f (x x))

akron

  • Newbie
  • *
  • Сообщений: 1
    • Просмотр профиля
Re: [Oberon-07/11] Правила присваиваний.
« Ответ #9 : Октябрь 30, 2012, 10:42:37 pm »
Логично предположить, что присваивание разнотиповых указателей в языке Oberon-07/11 допускается, т. к. в языке предусмотрены операции охраны/проверки типа для переменных-указателей, которые были бы лишены всякого смысла. По всей видимости, Вирт просто забыл (в его без малого 80 лет) сделать исключение для указателей в правиле присваивания, ну или решил, что читатель сам догадается))

Губанов Сергей Юрьевич

  • Hero Member
  • *****
  • Сообщений: 590
    • Просмотр профиля
    • Домашняя страница
Re: [Oberon-07/11] Правила присваиваний.
« Ответ #10 : Октябрь 31, 2012, 08:41:23 am »
pa := pb; (* error, ибо PA&PB - это не записи *)

pb := pa(PB); здесь понятно зачем явное приведение типов
pa := pb(PA); здесь явное приведение типов тупо для симметрии с предыдущим случаем :)

Тогда уж и для записей надо было также сделать

b := a(B);
a := b(A);

А то как-то непоследовательно...

vlad

  • Hero Member
  • *****
  • Сообщений: 1391
    • Просмотр профиля
Re: [Oberon-07/11] Правила присваиваний.
« Ответ #11 : Октябрь 31, 2012, 11:35:25 am »
pb := pa(PB); здесь понятно зачем явное приведение типов
pa := pb(PA); здесь явное приведение типов тупо для симметрии с предыдущим случаем :)

Даже если оставить в покое "синатксический оверхед", то тупо для симметрии не катит, потому что оно несимметрично ни разу :) Семантика действий разная. В одном случае оно пытается привести тип, в другом - тип гарантировано будет приведен. Уж если хотелось явного приведения, то должна была быть отдельная синтаксическая форма для каста вверх по иерархии наследования. Причем для записей тоже (для симметрии).

P.S. Вирт просто недоработал описание языка. Ну и ООП заморочки ему, как я понимаю, глубоко фиолетовы. Во всяком случае для текущих задач.

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Re: [Oberon-07/11] Правила присваиваний.
« Ответ #12 : Октябрь 31, 2012, 12:54:23 pm »
pb := pa(PB); здесь понятно зачем явное приведение типов
pa := pb(PA); здесь явное приведение типов тупо для симметрии с предыдущим случаем :)

Даже если оставить в покое "синатксический оверхед", то тупо для симметрии не катит, потому что оно несимметрично ни разу :) Семантика действий разная. В одном случае оно пытается привести тип, в другом - тип гарантировано будет приведен.
Или не приведен :-)
В первом случае у нас будет рантайм-проверка (dynamic_cast) с возможным трапом в результате. А что будет во втором случае?

Согласно вот этому:
Цитировать
The typeguard v(T0) asserts that v is of type T0, i.e. it aborts program execution, if it is not of type
T0. The guard is applicable, if
1. T0 is an extension of the declared type T of v, and if
2. v is a variable parameter of record type, or v is a pointer.
во втором случае просто не должно скомпилироваться, ибо typeguard не применим в этом случае (для того, чтобы было применимо, необходимо чтобы выполнялись одновременно оба условия (1 и 2), а у нас первое условие не выполняется - у нас не T0 является расширением T, а наоборот).
Y = λf.(λx.f (x x)) (λx.f (x x))

DIzer

  • Гость
Re: [Oberon-07/11] Правила присваиваний.
« Ответ #13 : Октябрь 31, 2012, 02:56:08 pm »
ФИ  как все жухло, однако- тратить время которое не вернуть на обсуждение  такой х..ни.... не жалко господа?

Geniepro

  • Hero Member
  • *****
  • Сообщений: 1955
  • Знайте- истина в том, что повторено трижды подряд!
    • Просмотр профиля
Re: [Oberon-07/11] Правила присваиваний.
« Ответ #14 : Ноябрь 01, 2012, 04:59:20 am »
Так полнолуние в разгаре, раз уж клевет новых нет, надо хоть так время потратить...
to iterate is human, to recurse, divine

Салат «рекурсия»: помидоры, огурцы, салат…