OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Четверг, 18 Апрель, 2024 14:55

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 25 ]  На страницу 1, 2  След.
Автор Сообщение
СообщениеДобавлено: Среда, 15 Июль, 2020 23:59 
Аватара пользователя

Зарегистрирован: Суббота, 16 Февраль, 2008 02:47
Сообщения: 660
Коллеги,

ежу понятно, что если
Код:
TYPE T = RECORD END; A = T; B = T; VAR a: A; b: B;

то переменная a и выражение b совместимы по присваиванию:
Код:
a := b (* ok *)

и компилятор CP2 Того же мнения )

Однако как это строго вывести из Сообщения о языке? Привожу цитату здесь для удобства:

Цитата:
Assignment compatible
An expression e of type Te is assignment compatible with a variable v of type Tv if one of the following conditions hold:
1. Te and Tv are equal and neither abstract, extensible, or limited record nor open array types;
...

Equal types
Two types Ta and Tb are equal if
1. Ta and Tb are the same type, or
...

Same types
Two variables a and b with types Ta and Tb are of the same type if
s1. Ta and Tb are both denoted by the same type identifier, or
s2. Ta is declared in a type declaration of the form Ta = Tb, or
s3. a and b appear in the same identifier list in a variable, record field, or formal parameter declaration.


Во-первых, понятие same types определяется для двух переменных, а понятие equal types - для типов. Выходит, что только две переменные могут быть same type, а, например, a := b^ несовместимы по присваиванию, поскольку b^ Не переменная, а выражение. Кмк, это огрех.

Но еще хуже с приведенным примером. На каком основании делать (очевидный) вывод, что a и b совместимы по присваиванию? И что типы A и B - это equal types, поскольку они Same types? Не подходит ни один из пунктов s1-s3. Это уже не огрех, а посерьезней.

Что скажете?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Четверг, 16 Июль, 2020 00:35 

Зарегистрирован: Пятница, 11 Январь, 2019 19:26
Сообщения: 293
Откуда: Russia
Так A и B это лишь алиасы типа Т, то есть тип A = тип B = тип T


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Четверг, 16 Июль, 2020 01:48 
Аватара пользователя

Зарегистрирован: Суббота, 16 Февраль, 2008 02:47
Сообщения: 660
Sergej Durmanov писал(а):
Так A и B это лишь алиасы типа Т, то есть тип A = тип B = тип T

Строго говоря, T - это не тип, а идентификатор типа; в приведенном примере все три идентификатора A, B, T ссылаются на один и тот же тип RECORD END. И понятно, что тут полная совместимость по присваиванию. Непонятно - как эту совместимость строго вывести из положений Сообщения о языке.

Вот, если я прально вспомнил, не хватает где-то указания, что отношение Same type транзитивно, т.е. Ta = Tb и Tb = Tc => Ta = Tc. Но это не точно, и, кажется, недостаточно.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Четверг, 16 Июль, 2020 07:22 

Зарегистрирован: Понедельник, 28 Ноябрь, 2005 10:28
Сообщения: 1428
b^ - выражение, значением которого является переменная.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Четверг, 16 Июль, 2020 16:01 
Аватара пользователя

Зарегистрирован: Суббота, 16 Февраль, 2008 02:47
Сообщения: 660
Trurl писал(а):
b^ - выражение, значением которого является переменная.

Коллега, вы совершенно правы! Так и сказано в Сообщении:
LR писал(а):
If p designates a pointer, p^ denotes the variable which is referenced by p

Чего не скажешь про b[i] или b.f: результат этих селекторов - "элемент".
Поэтому мой пример, строгости ради, нужно поправить:
Цитата:
a := b[i] несовместимы по присваиванию, поскольку b[i] не переменная, а выражение


Однако ваш пост помог мне осознать еще одну несостыковку в Сообщении: там неоднократно употребляется понятие variable, а имеется в виду (говорю исходя из "обычаев делового оборота") variable, field или array element, например тут:
LR section 8.1 писал(а):
Dereferencing is also implied if a pointer is assigned to a variable of a record or array type

и в определении Same type


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Четверг, 16 Июль, 2020 17:00 

Зарегистрирован: Понедельник, 28 Ноябрь, 2005 10:28
Сообщения: 1428
Вообще, исходя из обычаев, в паскале и наследниках, а также,напрмер, в c# поля и элементы массива - переменные.
Иначе нельзч было бы вызывать P(a.p), где P(VAR x... )


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Пятница, 17 Июль, 2020 01:15 
Аватара пользователя

Зарегистрирован: Суббота, 16 Февраль, 2008 02:47
Сообщения: 660
Trurl писал(а):
Вообще, исходя из обычаев, в паскале и наследниках, а также,напрмер, в c# поля и элементы массива - переменные.
Иначе нельзч было бы вызывать P(a.p), где P(VAR x... )


Пожалуй, согласен с вами, коллега; но можно и поспорить :wink: : обычаи - дело такое, один так скажет, другой иначе... на то и есть Сообщение о языке, чтобы строго и ясно все определить, и никому потом не сражаться, как на самом деле принято. Но, видимо, в Сообщении это упущено. По крайней мере, голосов, которые указали бы, где это определено - не слышно.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Пятница, 17 Июль, 2020 11:47 
Аватара пользователя

Зарегистрирован: Пятница, 25 Ноябрь, 2005 12:02
Сообщения: 8500
Откуда: Троицк, Москва
Сообщение пытается абстрактно описать некую реальность, отталкиваться нужно от неё, от реальности.

Реальность в том, что переменные -- это прежде всего связные блоки байтов, которым (это второе) приписаны типы.
Некоторые языковые конструкции как раз и обозначают связные блоки байтов. Например, всё, что может появиться в левой части присваивания.

Все обсуждаемые правила про VAR для полей (если мой мозг не глючит, что уже возможно) сразу становятся естественными.

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

Традиция (ещё от Алгола) -- говорить о "языках высокого уровня" в полном отрыве от железа. Но понять Оберон-идею, невозможно, не помня, что Оберон-язык -- это тонкий слой абстракции над железом.

Преподаватели вводных курсов знают, что при обучении важно научить "видеть" железо под конструкциями языка -- это несколько противоречит the традиции. Андрей Хапугин из новосибирского Академгородка делился в 2005 г. именно таким опытом -- только там речь шла о физиках-первокурсниках и праОбероне (Модуле-2).


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Пятница, 17 Июль, 2020 16:36 
Аватара пользователя

Зарегистрирован: Четверг, 08 Октябрь, 2009 15:00
Сообщения: 3776
adimetrius писал(а):
... поскольку b^ Не переменная, а выражение. Кмк, это огрех.

Цитата:
Если p — составное имя, обозначающее указатель, то p^ обозначает переменную, на которую ссылается p.


Получается, что b^ — это всё-таки переменная согласно сообщению о КП. Не выражение.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Пятница, 17 Июль, 2020 22:25 
Аватара пользователя

Зарегистрирован: Суббота, 16 Февраль, 2008 02:47
Сообщения: 660
Иван Денисов писал(а):
adimetrius писал(а):
... поскольку b^ Не переменная, а выражение. Кмк, это огрех.

Цитата:
Если p — составное имя, обозначающее указатель, то p^ обозначает переменную, на которую ссылается p.


Получается, что b^ — это всё-таки переменная согласно сообщению о КП. Не выражение.


Согл. п. 8 это - выражение; согл. п. 4 оно обозначает переменную, на которую ссылается b; возвращаясь в п. 8, значение выражения b^ - это текущее значение переменной, на которую ссылается b.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Суббота, 18 Июль, 2020 00:23 
Аватара пользователя

Зарегистрирован: Пятница, 25 Ноябрь, 2005 12:02
Сообщения: 8500
Откуда: Троицк, Москва
Если p^ стоит в левой части присваивания, то это переменная, являющаяся значением выражения p^.

Если в правой -- то значение, хранящееся в этой переменной.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Суббота, 18 Июль, 2020 05:33 
Аватара пользователя

Зарегистрирован: Четверг, 08 Октябрь, 2009 15:00
Сообщения: 3776
adimetrius писал(а):
Согл. п. 8 это - выражение; согл. п. 4 оно обозначает переменную, на которую ссылается b; возвращаясь в п. 8, значение выражения b^ - это текущее значение переменной, на которую ссылается b.

Так вот эта цитата как раз из пункта 8. Там написано, что p^ — это не выражение, а переменная у который составной идентификатор.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Суббота, 18 Июль, 2020 12:11 
Аватара пользователя

Зарегистрирован: Пятница, 25 Ноябрь, 2005 12:02
Сообщения: 8500
Откуда: Троицк, Москва
"Составной идентификатор" -- неудачное описание, поскольку он может быть довольно сложным и подразумевать сколь угодно сложные вычисления:

F().a[5].field.G()^ := record;

Это к тому, что язык Сообщения -- не самый удачный, т.к. невинные слова скрывают не вполне очевидные (особенно для начинающих) смыслы.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Суббота, 18 Июль, 2020 14:34 
Аватара пользователя

Зарегистрирован: Суббота, 16 Февраль, 2008 02:47
Сообщения: 660
Иван Денисов писал(а):
adimetrius писал(а):
Согл. п. 8 это - выражение; согл. п. 4 оно обозначает переменную, на которую ссылается b; возвращаясь в п. 8, значение выражения b^ - это текущее значение переменной, на которую ссылается b.

Так вот эта цитата как раз из пункта 8. Там написано, что p^ — это не выражение, а переменная у который составной идентификатор.


Я ошибся, п. 4 вообще не по теме, все в п. 8 и 8.1.

Но где там написано, что p^ - Переменная, мне не видно.
LR писал(а):
Если p — составное имя, обозначающее указатель, то p^ обозначает переменную, на которую ссылается p.

If p designates a pointer, p^ denotes the variable which is referenced by p.


Я читаю в СЯ, что p^ обозначает переменную, а у вас читаю, что p^ является переменной. Кмк, обозначать и являться - существенно разные предикаты.

******************
Я раньше не знакомился с русскоязычным переводом; кмк "составное имя" - весьма оригинальный и нетривиальный подход к переводу designator, которого напрямую нет в РЯ. На первый взгляд - очень, очень интересно! Браво! (Кому отправить браво? Автор среди нас?) Надо повнимательней познакомиться с этим термином в других контекстах.

И здорово, что "имя", а не громоздкий "идентификатор". Хотя Identifier далее переведено как раз "идентификатором".


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Суббота, 18 Июль, 2020 16:24 
Аватара пользователя

Зарегистрирован: Четверг, 08 Октябрь, 2009 15:00
Сообщения: 3776
adimetrius писал(а):
Я читаю в СЯ, что p^ обозначает переменную, а у вас читаю, что p^ является переменной. Кмк, обозначать и являться - существенно разные предикаты.


Ну по идее то все лексемы языка могут только обозначать... обозначать переменную, обозначать выражение и т.п.

Суть в том, если я правильно понимаю, что при p^ никаких вычислений не происходит. На этапе компиляции происходит интерпретация этого составного имени как имени переменной.

Цитата:
p^ denotes the variable

Думаю, что тут denote в первом значении "обозначать" или третьем значении значить как indicate

Цитата:
<--- LingvoUniversal (En-Ru) --->
denote
[dɪˈnəut]
гл.
1) отмечать (знаком, меткой), обозначать; различать, отличать
Such entry shall in the register be denoted by an asterisk. — Такая запись отмечается в журнале звёздочкой.
Syn:
mark, distinguish
2) показывать; указывать (на факт, обстоятельство); свидетельствовать
A quick pulse denotes fever. — Частый пульс указывает на жар.
A falling barometer denotes an approaching storm. — Падение барометра свидетельствует о приближающемся шторме.
Syn:
indicate
3) значить, означать; символизировать
Syn:



Цитата:
Автор среди нас?
Фёдор Васильевич автор перевода. Я только оформительством этого документа занимался в той версии, которая распространяется тут https://blackbox.oberon.org/extension/Rus


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Суббота, 18 Июль, 2020 17:48 
Аватара пользователя

Зарегистрирован: Четверг, 08 Октябрь, 2009 15:00
Сообщения: 3776
Сверил перевод со школьной сборкой. Отличия есть. Я брал из пакета "дельта", а потом наверное какие-то правки терминологии всё таки были... ну не суть. "составное имя" — это есть в школьной сборке Info21.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Суббота, 18 Июль, 2020 20:26 

Зарегистрирован: Пятница, 11 Январь, 2019 19:26
Сообщения: 293
Откуда: Russia
adimetrius писал(а):
LR писал(а):
Если p — составное имя, обозначающее указатель, то p^ обозначает переменную, на которую ссылается p.

If p designates a pointer, p^ denotes the variable which is referenced by p.

Откуда у перводе взялось понятие «составное имя»? Референция, десигнация, денотация ' это, по-сути, синонимы. И перевод здесь простой и понятный
Цитата:
Если p обозначает указатель, p ^ обозначает переменную, на которую ссылается p.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Суббота, 18 Июль, 2020 20:28 

Зарегистрирован: Пятница, 11 Январь, 2019 19:26
Сообщения: 293
Откуда: Russia
Зачем в перевод вносить отсебятину?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Суббота, 18 Июль, 2020 23:47 
Аватара пользователя

Зарегистрирован: Пятница, 25 Ноябрь, 2005 12:02
Сообщения: 8500
Откуда: Троицк, Москва
Если есть конкретные замечания по переводу Сообщения в школьной сборке, то скажу спасибо, но окончательное решение оставлю за собой.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Воскресенье, 19 Июль, 2020 00:06 
Аватара пользователя

Зарегистрирован: Пятница, 25 Ноябрь, 2005 12:02
Сообщения: 8500
Откуда: Троицк, Москва
Info21 писал(а):
"Составной идентификатор" -- неудачное описание, поскольку он может быть довольно сложным и подразумевать сколь угодно сложные вычисления:

F().a[5].field.G()^ := record;
Проверил -- у меня в переводе всё-таки "составное имя", а не "составной идентификатор", что было бы как раз отсебятиной.

"Идентификатор" -- совершенно однозначное и узкое чисто синтаксическое понятие: набор букв и цифр etc.

PS Спасибо за комплимент (adimetrius).


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 25 ]  На страницу 1, 2  След.

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 8


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Вся информация, размещаемая участниками на конференции (тексты сообщений, вложения и пр.) © 2005-2024, участники конференции «OberonCore», если специально не оговорено иное.
Администрация не несет ответственности за мнения, стиль и достоверность высказываний участников, равно как и за безопасность материалов, предоставляемых участниками во вложениях.
Без разрешения участников и ссылки на конференцию «OberonCore» любое воспроизведение и/или копирование высказываний полностью и/или по частям запрещено.
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB