OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Вторник, 19 Март, 2024 14:37

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




Начать новую тему Ответить на тему  [ Сообщений: 17 ] 
Автор Сообщение
СообщениеДобавлено: Вторник, 09 Ноябрь, 2010 10:19 

Зарегистрирован: Суббота, 07 Март, 2009 15:39
Сообщения: 3261
Откуда: Астрахань
Посмотрел все темы в этом разделе и не могу найти явные ответы на некоторые вопросы.
1. В КП определен общий базовый тип ANYREC и соответственно, указатель на общий базовый тип ANYPTR.
Таким образом, должен работать принцип подстановки Лисков: на место объекта базового типа может быть подставлен объект производного типа.
В сообщении о языке при описании оператора with обнаруживаем следующее описание, косвенно подтверждающее наличие принципа подстановки:
Цитата:
Åñëè v — ïàðàìåòð-ïåðåìåííàÿ òèïà çàïèñåé èëè óêàçàòåëüíàÿ ïåðåìåííàÿ, è åñëè åå ñòàòè÷åñêèé òèï T0, òî çíà÷åíèå îïåðàòîðà

WITH v: T1 DO S1 | v: T2 DO S2 ELSE S3 END

òàêîâî: åñëè äèíàìè÷åñêèì òèïîì ïåðåìåííîé v îêàçàëñÿ T1, òî âûïîëíÿåòñÿ îïåðàòîðíàÿ ïîñëåäî­âà­òåëüíîñòü S1, â êîòîðîé v ðàññìàòðèâàåòñÿ êàê åñëè áû åå ñòàòè÷åñêèì òèïîì áûë T1; â ïðîòèâíîì ñëó÷àå åñëè äèíàìè÷åñêèì òèïîì v îêàçàëñÿ T2, òî âûïîëíÿåòñÿ S2, â êîòîðîé v ðàññìàòðèâàåòñÿ êàê åñëè áû åå ñòàòè÷åñêèì òèïîì áûë T2; â ïðîòèâíîì ñëó÷àå âûïîëíÿåòñÿ S3. T1 è T2 äîëæíû áûòü ïîòîìêàìè òèïà T0.

О-па! Как сие исправить? Это текст из русской справки. Выставить в справке другой шрифт? У меня win 2000 сейчас.

Но суть в том, что выполняется та ветка, в которой динамический тип переменной v совпадает с прописанным типом: t1 или t2. А если не совпадает, то выполняется ветка else.
Однако в приложении А совместимость по присваиванию определена только для указательных типов.
Явно об этом нигде не написано, но получается, что для объектов типа записей принцип подстановки не выполняется, а выполняется только для указателей на записи.
Второе. Значит ли это, что в операторе with можно задавать только указатели, а не сами объекты? Получается именно так.
Если это так, то понятно почему в КП нигде не упоминается и срезке, когда на место объета базового типа подставляется объект производного типа с новыми полями, которых нет в базовом.
Это же самое означает, что мы не можем писать процедуру с параметром-объектом базового типа, чтобы она обрабатывала объекты производного типа. Можно передавать только базовый указатель.
2. В С++ есть два способа для работы с типами во время исполнения: RTTI и виртуальность.
Как я понимаю, оператор with является неким аналогом RTTI - явные проверки динамического типа. Во всех учебниках по С++ написано, что желательно RTTI не использовать, поскольку есть виртуальные функции. Да я сам писал об этом.
По некоторым постам и текстам получается, что виртуальность в КП есть. Например, v.method() - вызывается метод по динамическому типу v, а не по статическому. Или это не так? v тогда должен быть указателем на базовый тип.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 09 Ноябрь, 2010 12:48 
Аватара пользователя

Зарегистрирован: Пятница, 25 Ноябрь, 2005 18:55
Сообщения: 2272
Откуда: Россия, Нижний Новгород
Валерий Лаптев писал(а):
мы не можем писать процедуру с параметром-объектом базового типа, чтобы она обрабатывала объекты производного типа
Вы это только сейчас узнали?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 09 Ноябрь, 2010 13:34 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9459
Откуда: Россия, Орёл
Валерий Лаптев писал(а):
Это же самое означает, что мы не можем писать процедуру с параметром-объектом базового типа, чтобы она обрабатывала объекты производного типа. Можно передавать только базовый указатель.


Или ссылку!!! VAR/IN rec: ANYREC - пожалуйста...


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 09 Ноябрь, 2010 13:41 

Зарегистрирован: Четверг, 12 Июль, 2007 23:18
Сообщения: 1982
Откуда: Узбекистан, Чирчик
Ну логично -- если попробовать передать по значению вместо объекта базового типа объект производного типа, то произойдёт обрезка объекта, и мало ли какие баги в результате произойдут. Только по ссылке/указателю передавать...


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 09 Ноябрь, 2010 20:32 

Зарегистрирован: Суббота, 07 Март, 2009 15:39
Сообщения: 3261
Откуда: Астрахань
Так, вроде с первым вопросом разобрались. Значит это один из тех краеугольных ограничений, которыми полон Оберон-КП.
Как со вторым вопросом?

Вообще меня уже пару месяцев свербит написать что-то типа эссе: Почему я разлюбил С++.
И вбросить это на РСДН... :mrgreen:

Основная мысль: два принципиально разных подхода в разработке языка
1. Все, что не запрещено явно - разрешено (С++);
2. Все, что не разрешено явно - запрещено (Оберон-КП);

Должен сказать, что с точки зрения обучения мне второй подход за последние полтора-два года стал гораздо ближе... :)
Я уже на лекциях обращаю внимание студиозов на "передоз" сложности С++ в некоторых местах (не говоря уже о шаблонах) :)

Дык как со вторым вопросом?

И еще конкретно Илью прошу разъяснить термин "родовая шина сообщений".
Достаточно привести намеки на аналоги - я пойму.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 09 Ноябрь, 2010 20:54 
Аватара пользователя

Зарегистрирован: Пятница, 25 Ноябрь, 2005 12:02
Сообщения: 8500
Откуда: Троицк, Москва
Валерий Лаптев писал(а):
прошу разъяснить термин "родовая шина сообщений".
Там перевод дикий: "общая шина сообщений". Или "шина общих сообщений".

А разъясняет пусть конкретно И.Е. :)


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 09 Ноябрь, 2010 20:57 

Зарегистрирован: Суббота, 07 Март, 2009 15:39
Сообщения: 3261
Откуда: Астрахань
Собственно не совсем понятен термин "шина сообщений". Я, наверное, слишком конкретный, но мне так и представляется некий объект в виде трубы :), куда все объекты "сливают" сообщения (вызовы методов)... :)


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 09 Ноябрь, 2010 21:01 
Аватара пользователя

Зарегистрирован: Вторник, 19 Сентябрь, 2006 21:54
Сообщения: 2449
Откуда: Россия, Томск
Валерий Лаптев писал(а):
Собственно не совсем понятен термин "шина сообщений". Я, наверное, слишком конкретный, но мне так и представляется некий объект в виде трубы :), куда все объекты "сливают" сообщения (вызовы методов)... :)
Так и есть, только вместо трубы - метод объекта с названием Handle(VAR msg: TMessage). По сути, тип конкретного экземпляра msg - это имя метода, а содержимое записи msg - переданные в метод параметры.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 09 Ноябрь, 2010 21:05 

Зарегистрирован: Суббота, 07 Март, 2009 15:39
Сообщения: 3261
Откуда: Астрахань
Это в каком модуле прописано?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 09 Ноябрь, 2010 21:19 
Аватара пользователя

Зарегистрирован: Вторник, 19 Сентябрь, 2006 21:54
Сообщения: 2449
Откуда: Россия, Томск
Валерий Лаптев писал(а):
Это в каком модуле прописано?
Это общий подход к организации. В любом объекте создаём такой метод, а в наследниках этого объекта переопределяем процедуру Handle и добавляем наследников TMessage. Вообще, в учебнике же это есть. См. Wirth N. Programming In Oberon: Steps Beyond Pascal and Modula, глава 12, раздел 12.5 "Message and handlers".


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 09 Ноябрь, 2010 21:32 

Зарегистрирован: Суббота, 07 Март, 2009 15:39
Сообщения: 3261
Откуда: Астрахань
Ага, в этот учебник я не заглядывал... :)
Спасибо, посмотрю.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 09 Ноябрь, 2010 21:46 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9459
Откуда: Россия, Орёл
Ещё: http://oberoncore.ru/articles/start - "Некоторые идеи архитектуры Оберон-систем".

P.S. А перевод термина я когда-то унаследовал с вологодского сайта...


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 09 Ноябрь, 2010 23:16 
Аватара пользователя

Зарегистрирован: Пятница, 25 Ноябрь, 2005 12:02
Сообщения: 8500
Откуда: Троицк, Москва
Александр Ильин писал(а):
только вместо трубы - метод объекта с названием Handle(VAR msg: TMessage).
Не вполне верно.
Труба, это, скорее, тот, обычно закадровый механизм раздачи сообщений.

Только почему труба.
Вроде бы с обычной электрической шиной прямая аналогия, к которой (шине) подключают устройства.
И уж скорее не труба, а коридор со многими дверями.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 10 Ноябрь, 2010 12:03 
Аватара пользователя

Зарегистрирован: Пятница, 25 Ноябрь, 2005 18:55
Сообщения: 2272
Откуда: Россия, Нижний Новгород
Валерий Лаптев писал(а):
Так, вроде с первым вопросом разобрались. Значит это один из тех краеугольных ограничений, которыми полон Оберон-КП.
Оберон тут не при чём. Невозможно передать в процедуру абстрактный объект по значению. Вообще невозможно, а не в Обероне невозможно. Доступ к полиморфным объектам всегда по указателю/ссылке осуществляется.
Валерий Лаптев писал(а):
Вообще меня уже пару месяцев свербит написать что-то типа эссе: Почему я разлюбил С++. И вбросить это на РСДН...
Если в статье будет только про С++, но не будет про Оберон - да наздоровье, развлекайтесь сколько хотите. Но если Вы там про Оберон хотите упомянуть... то, как бы, есть просьба, прежде чем вбрасывать на РСДН сначала дайте нам почитать. Может что поправить посоветуем :roll:


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 10 Ноябрь, 2010 12:44 

Зарегистрирован: Понедельник, 28 Ноябрь, 2005 10:28
Сообщения: 1428
Валерий Лаптев писал(а):
Так, вроде с первым вопросом разобрались. Значит это один из тех краеугольных ограничений, которыми полон Оберон-КП.

На первый вопрос Оберон и КП отвечают по-разному.

Цитата:
мы не можем писать процедуру с параметром-объектом базового типа, чтобы она обрабатывала объекты производного типа.

В Обероне можем.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 10 Ноябрь, 2010 16:18 

Зарегистрирован: Суббота, 07 Март, 2009 15:39
Сообщения: 3261
Откуда: Астрахань
Сергей Губанов писал(а):
Валерий Лаптев писал(а):
Так, вроде с первым вопросом разобрались. Значит это один из тех краеугольных ограничений, которыми полон Оберон-КП.
Оберон тут не при чём. Невозможно передать в процедуру абстрактный объект по значению. Вообще невозможно, а не в Обероне невозможно. Доступ к полиморфным объектам всегда по указателю/ссылке осуществляется.
Валерий Лаптев писал(а):
Вообще меня уже пару месяцев свербит написать что-то типа эссе: Почему я разлюбил С++. И вбросить это на РСДН...
Если в статье будет только про С++, но не будет про Оберон - да наздоровье, развлекайтесь сколько хотите. Но если Вы там про Оберон хотите упомянуть... то, как бы, есть просьба, прежде чем вбрасывать на РСДН сначала дайте нам почитать. Может что поправить посоветуем :roll:

1. Я про абстрактные классы не говорил. Я - про принцип подстановки. Ограничение в Обероне-КП: нельзя работать с объектами, а можно только с указателями и ссылками.
2. Само-собой... :) Тут кстати, тоже недавно пришла в голову мысль. Есть такие журналы: Компьютерные инструменты в образовании и Компьютерные инструменты в школе. Почему бы, например, Ермакову и/или Федору Василичу не написать туда статьи про ББ+КП. И Виталий Потопахин тоже может очень нужную статью написать. Вот и пойдет инфа в школы. Журналы достаточно интересные, там, например, Сафронов несколько статей напечатал, Шалыто и еще ряд менее известных товарисчей.
Ы?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 10 Ноябрь, 2010 16:19 

Зарегистрирован: Суббота, 07 Март, 2009 15:39
Сообщения: 3261
Откуда: Астрахань
Trurl писал(а):
Валерий Лаптев писал(а):
Так, вроде с первым вопросом разобрались. Значит это один из тех краеугольных ограничений, которыми полон Оберон-КП.

На первый вопрос Оберон и КП отвечают по-разному.
Цитата:
мы не можем писать процедуру с параметром-объектом базового типа, чтобы она обрабатывала объекты производного типа.

В Обероне можем.

Спасибо!


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 17 ] 

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


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

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


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

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