Oberon space

General Category => Общий раздел => Тема начата: adva от Октябрь 19, 2013, 08:40:29 am

Название: Отличия КП от Оберона 07
Отправлено: adva от Октябрь 19, 2013, 08:40:29 am
Заведу отдельную тему.

Если я правильно понял, то в О7 нет связанных с типом процедур.

Как должно быть изменено следующая строка из КП:

PROCEDURE (op: Op) Do

Я правильно понял, что надо у типа Op задать методо Do ? Как то так

TYPE
  Op = RECORD
    Do:PROCEDURE
  END

И как потом задать текст этой процедуры? Просто присвоением?
Название: Re: Отличия КП от Оберона 07
Отправлено: Madzi от Октябрь 19, 2013, 01:00:31 pm
Можно делать так, как это делается в gtk. Т.е.
PROCEDURE (op: Op) Do (x, y : INTEGER);
превращается в
PROCEDURE Do(op: Op; x, y: INTEGER);
Название: Re: Отличия КП от Оберона 07
Отправлено: valexey_u от Октябрь 19, 2013, 01:05:37 pm
Можно делать так, как это делается в gtk. Т.е.
PROCEDURE (op: Op) Do (x, y : INTEGER);
превращается в
PROCEDURE Do(op: Op; x, y: INTEGER);
Но вызов получается довольно многословным:
ModuleName.Do(op, 100,500);
Вместо
op.Do(100,500);
Название: Re: Отличия КП от Оберона 07
Отправлено: adva от Октябрь 19, 2013, 01:17:31 pm
Ага, особенно если учесть, что свойства Op извне доступны только на чтение (если  я правильно понял).
Название: Re: Отличия КП от Оберона 07
Отправлено: valexey_u от Октябрь 19, 2013, 01:21:21 pm
Ага, особенно если учесть, что свойства Op извне доступны только на чтение (если  я правильно понял).
Давай код (модуль) целиком - скажу что там видно, а что нет.
Название: Re: Отличия КП от Оберона 07
Отправлено: adva от Октябрь 19, 2013, 01:28:01 pm
Давай код (модуль) целиком - скажу что там видно, а что нет.
Да не, это я про многословность указанную выше (Modul.Do(Op), вместо Op.Do()). В этом же случае в процедуре Do нельзя присваивать свойства у Op ?

Модуля пока нет, пока только продумываю, чего надо. И пробую по мелочи
Название: Re: Отличия КП от Оберона 07
Отправлено: Geniepro от Октябрь 19, 2013, 01:38:48 pm
Заведу отдельную тему.

Если я правильно понял, то в О7 нет связанных с типом процедур.

Как должно быть изменено следующая строка из КП:

PROCEDURE (op: Op) Do

Я правильно понял, что надо у типа Op задать методо Do ? Как то так

TYPE
  Op = RECORD
    Do:PROCEDURE
  END

И как потом задать текст этой процедуры? Просто присвоением?

Ну да, процедурная переменная, которой при создании объекта присваивается нужная процедура-метод.
Название: Re: Отличия КП от Оберона 07
Отправлено: valexey_u от Октябрь 19, 2013, 01:41:03 pm
Давай код (модуль) целиком - скажу что там видно, а что нет.
Да не, это я про многословность указанную выше (Modul.Do(Op), вместо Op.Do()). В этом же случае в процедуре Do нельзя присваивать свойства у Op ?
Поля записи она (Do) менять может. Особенно если объявить Do как PROCEDURE Do(VAR op: Op; x, y: INTEGER);
Название: Re: Отличия КП от Оберона 07
Отправлено: Valery Solovey от Октябрь 19, 2013, 01:51:32 pm
Modul.Do(Op), вместо Op.Do()
Op.Do(Op)
Название: Re: Отличия КП от Оберона 07
Отправлено: valexey_u от Октябрь 19, 2013, 01:55:40 pm
Modul.Do(Op), вместо Op.Do()
Op.Do(Op)
Во-первых лишний уровень косвенности (работает медленнее), во-вторых лишний расход памяти (если переменных аля Op будет много - то расход памяти будет существенный). В третьих - тот же самый синтаксический оверхед:
ModuleName.Do(VariableName);
VariableName.Do(VariableName);
Название: Re: Отличия КП от Оберона 07
Отправлено: Kemet от Октябрь 19, 2013, 02:48:41 pm
лишний расход памяти (если переменных аля Op будет много - то расход памяти будет существенный).
С учётом, что в Оберонах все методы являются виртуальными, лишнего расхода памяти, по сравнению с ООП версией, нет
Название: Re: Отличия КП от Оберона 07
Отправлено: valexey_u от Октябрь 19, 2013, 03:02:54 pm
лишний расход памяти (если переменных аля Op будет много - то расход памяти будет существенный).
С учётом, что в Оберонах все методы являются виртуальными, лишнего расхода памяти, по сравнению с ООП версией, нет
Предлагаю еще раз перечитать контекст :-)
В Обероне НЕТ методов.
Название: Re: Отличия КП от Оберона 07
Отправлено: Kemet от Октябрь 19, 2013, 03:20:28 pm
лишний расход памяти (если переменных аля Op будет много - то расход памяти будет существенный).
С учётом, что в Оберонах все методы являются виртуальными, лишнего расхода памяти, по сравнению с ООП версией, нет
Предлагаю еще раз перечитать контекст :-)
В Обероне НЕТ методов.
Как бэ речь шла о компонентном паскале, который суть диалект оберона и в нём методы есть, ну пусть они и называются "связанные с типом процедуры".
Название: Re: Отличия КП от Оберона 07
Отправлено: valexey_u от Октябрь 19, 2013, 03:27:12 pm
лишний расход памяти (если переменных аля Op будет много - то расход памяти будет существенный).
С учётом, что в Оберонах все методы являются виртуальными, лишнего расхода памяти, по сравнению с ООП версией, нет
Предлагаю еще раз перечитать контекст :-)
В Обероне НЕТ методов.
Как бэ речь шла о компонентном паскале, который суть диалект оберона и в нём методы есть, ну пусть они и называются "связанные с типом процедуры".

Нет, речь шла о Обероне. Предлагалось писать так:
Modul.Do(Op), вместо Op.Do()
Op.Do(Op)

Соответственно Op будет с собой таскать пачку процедурных полей. На что я и заметил, что это оверхед.
Название: Re: Отличия КП от Оберона 07
Отправлено: Valery Solovey от Октябрь 20, 2013, 10:21:13 am
Да, это для Оберона, а не для КП. Да, заводится лишняя переменная. Но если модуль экспортирует несколько типов, то в момент инициализации соответствующих переменных им могут присваиваться разные процедуры в одно и то же поле. Полиморфизм.