Автор Тема: Отличия КП от Оберона 07  (Прочитано 7850 раз)

adva

  • Sr. Member
  • ****
  • Сообщений: 385
    • Просмотр профиля
Отличия КП от Оберона 07
« : Октябрь 19, 2013, 08:40:29 am »
Заведу отдельную тему.

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

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

PROCEDURE (op: Op) Do

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

TYPE
  Op = RECORD
    Do:PROCEDURE
  END

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

Madzi

  • Jr. Member
  • **
  • Сообщений: 86
    • Просмотр профиля
Re: Отличия КП от Оберона 07
« Ответ #1 : Октябрь 19, 2013, 01:00:31 pm »
Можно делать так, как это делается в gtk. Т.е.
PROCEDURE (op: Op) Do (x, y : INTEGER);
превращается в
PROCEDURE Do(op: Op; x, y: INTEGER);

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Re: Отличия КП от Оберона 07
« Ответ #2 : Октябрь 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);
Y = λf.(λx.f (x x)) (λx.f (x x))

adva

  • Sr. Member
  • ****
  • Сообщений: 385
    • Просмотр профиля
Re: Отличия КП от Оберона 07
« Ответ #3 : Октябрь 19, 2013, 01:17:31 pm »
Ага, особенно если учесть, что свойства Op извне доступны только на чтение (если  я правильно понял).

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Re: Отличия КП от Оберона 07
« Ответ #4 : Октябрь 19, 2013, 01:21:21 pm »
Ага, особенно если учесть, что свойства Op извне доступны только на чтение (если  я правильно понял).
Давай код (модуль) целиком - скажу что там видно, а что нет.
Y = λf.(λx.f (x x)) (λx.f (x x))

adva

  • Sr. Member
  • ****
  • Сообщений: 385
    • Просмотр профиля
Re: Отличия КП от Оберона 07
« Ответ #5 : Октябрь 19, 2013, 01:28:01 pm »
Давай код (модуль) целиком - скажу что там видно, а что нет.
Да не, это я про многословность указанную выше (Modul.Do(Op), вместо Op.Do()). В этом же случае в процедуре Do нельзя присваивать свойства у Op ?

Модуля пока нет, пока только продумываю, чего надо. И пробую по мелочи

Geniepro

  • Hero Member
  • *****
  • Сообщений: 1955
  • Знайте- истина в том, что повторено трижды подряд!
    • Просмотр профиля
Re: Отличия КП от Оберона 07
« Ответ #6 : Октябрь 19, 2013, 01:38:48 pm »
Заведу отдельную тему.

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

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

PROCEDURE (op: Op) Do

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

TYPE
  Op = RECORD
    Do:PROCEDURE
  END

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

Ну да, процедурная переменная, которой при создании объекта присваивается нужная процедура-метод.
to iterate is human, to recurse, divine

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

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Re: Отличия КП от Оберона 07
« Ответ #7 : Октябрь 19, 2013, 01:41:03 pm »
Давай код (модуль) целиком - скажу что там видно, а что нет.
Да не, это я про многословность указанную выше (Modul.Do(Op), вместо Op.Do()). В этом же случае в процедуре Do нельзя присваивать свойства у Op ?
Поля записи она (Do) менять может. Особенно если объявить Do как PROCEDURE Do(VAR op: Op; x, y: INTEGER);
Y = λf.(λx.f (x x)) (λx.f (x x))

Valery Solovey

  • Hero Member
  • *****
  • Сообщений: 509
    • Просмотр профиля
Re: Отличия КП от Оберона 07
« Ответ #8 : Октябрь 19, 2013, 01:51:32 pm »
Modul.Do(Op), вместо Op.Do()
Op.Do(Op)

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Re: Отличия КП от Оберона 07
« Ответ #9 : Октябрь 19, 2013, 01:55:40 pm »
Modul.Do(Op), вместо Op.Do()
Op.Do(Op)
Во-первых лишний уровень косвенности (работает медленнее), во-вторых лишний расход памяти (если переменных аля Op будет много - то расход памяти будет существенный). В третьих - тот же самый синтаксический оверхед:
ModuleName.Do(VariableName);
VariableName.Do(VariableName);
Y = λf.(λx.f (x x)) (λx.f (x x))

Kemet

  • Hero Member
  • *****
  • Сообщений: 587
    • Просмотр профиля
Re: Отличия КП от Оберона 07
« Ответ #10 : Октябрь 19, 2013, 02:48:41 pm »
лишний расход памяти (если переменных аля Op будет много - то расход памяти будет существенный).
С учётом, что в Оберонах все методы являются виртуальными, лишнего расхода памяти, по сравнению с ООП версией, нет

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Re: Отличия КП от Оберона 07
« Ответ #11 : Октябрь 19, 2013, 03:02:54 pm »
лишний расход памяти (если переменных аля Op будет много - то расход памяти будет существенный).
С учётом, что в Оберонах все методы являются виртуальными, лишнего расхода памяти, по сравнению с ООП версией, нет
Предлагаю еще раз перечитать контекст :-)
В Обероне НЕТ методов.
Y = λf.(λx.f (x x)) (λx.f (x x))

Kemet

  • Hero Member
  • *****
  • Сообщений: 587
    • Просмотр профиля
Re: Отличия КП от Оберона 07
« Ответ #12 : Октябрь 19, 2013, 03:20:28 pm »
лишний расход памяти (если переменных аля Op будет много - то расход памяти будет существенный).
С учётом, что в Оберонах все методы являются виртуальными, лишнего расхода памяти, по сравнению с ООП версией, нет
Предлагаю еще раз перечитать контекст :-)
В Обероне НЕТ методов.
Как бэ речь шла о компонентном паскале, который суть диалект оберона и в нём методы есть, ну пусть они и называются "связанные с типом процедуры".

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Re: Отличия КП от Оберона 07
« Ответ #13 : Октябрь 19, 2013, 03:27:12 pm »
лишний расход памяти (если переменных аля Op будет много - то расход памяти будет существенный).
С учётом, что в Оберонах все методы являются виртуальными, лишнего расхода памяти, по сравнению с ООП версией, нет
Предлагаю еще раз перечитать контекст :-)
В Обероне НЕТ методов.
Как бэ речь шла о компонентном паскале, который суть диалект оберона и в нём методы есть, ну пусть они и называются "связанные с типом процедуры".

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

Соответственно Op будет с собой таскать пачку процедурных полей. На что я и заметил, что это оверхед.
Y = λf.(λx.f (x x)) (λx.f (x x))

Valery Solovey

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