Автор Тема: Уточнение поля записи типа запись  (Прочитано 6225 раз)

ilovb

  • Hero Member
  • *****
  • Сообщений: 2538
  • just another nazi test
    • Просмотр профиля
    • Oberon systems
Уточнение поля записи типа запись
« : Ноябрь 13, 2013, 08:58:37 am »
Возникла потребность уточнить тип поля в расширении записи:
MODULE test;
IMPORT JS;
TYPE
  r1 = RECORD
    a: INTEGER
  END;
  r2 = RECORD(r1)
    b: INTEGER
  END;
  r3 = RECORD
    r: r1
  END;
  r4 = RECORD(r3)
    r: r2 (* АХТУНГ! *)
  END;
BEGIN
END test.

Такое возможно вообще сделать?

ps Я правильно понимаю, что это невозможно из-за фиксированного смещения полей внутри записи? (т.е. расширенная запись тупо не влезет в отведенное предком место)
« Последнее редактирование: Ноябрь 13, 2013, 09:01:49 am от ilovb »

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Re: Уточнение поля записи типа запись
« Ответ #1 : Ноябрь 13, 2013, 09:28:36 am »
Возникла потребность уточнить тип поля в расширении записи:
MODULE test;
IMPORT JS;
TYPE
  r1 = RECORD
    a: INTEGER
  END;
  r2 = RECORD(r1)
    b: INTEGER
  END;
  r3 = RECORD
    r: r1
  END;
  r4 = RECORD(r3)
    r: r2 (* АХТУНГ! *)
  END;
BEGIN
END test.

Такое возможно вообще сделать?

ps Я правильно понимаю, что это невозможно из-за фиксированного смещения полей внутри записи? (т.е. расширенная запись тупо не влезет в отведенное предком место)
Насколько я понимаю, вообще не существует языка где такое возможно.
Y = λf.(λx.f (x x)) (λx.f (x x))

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Re: Уточнение поля записи типа запись
« Ответ #2 : Ноябрь 13, 2013, 09:31:15 am »
Точнее так - возможен язык где разрешение имен таково, что у потомка может быть ЕЩЕ ОДНО поле с названием совпадающим с полем предка. В этом случае r4 будет содержать и поле r с типом r1 и поле r с типом r2, это два разных поля, то есть две независимые переменные. Изменение одного поля никак не скажется на другом.
Y = λf.(λx.f (x x)) (λx.f (x x))

vlad

  • Hero Member
  • *****
  • Сообщений: 1391
    • Просмотр профиля
Re: Уточнение поля записи типа запись
« Ответ #3 : Ноябрь 13, 2013, 02:37:58 pm »
Возникла потребность уточнить тип поля в расширении записи:

Не поверишь. И такое я видел. Крайне запутывает.

Такое возможно вообще сделать?

Ну как обычно - через указательный тип.

ps Я правильно понимаю, что это невозможно из-за фиксированного смещения полей внутри записи? (т.е. расширенная запись тупо не влезет в отведенное предком место)

Да. Хотя в варианте oberonjs могло быть бы реализовано без проблем - там никаких смещений нет.

ilovb

  • Hero Member
  • *****
  • Сообщений: 2538
  • just another nazi test
    • Просмотр профиля
    • Oberon systems
Re: Уточнение поля записи типа запись
« Ответ #4 : Ноябрь 13, 2013, 02:42:10 pm »
Ну как обычно - через указательный тип.
Через указатель понятно что можно. Но это лишний объект в куче.
Вопрос именно в RECORD

vlad

  • Hero Member
  • *****
  • Сообщений: 1391
    • Просмотр профиля
Re: Уточнение поля записи типа запись
« Ответ #5 : Ноябрь 13, 2013, 02:42:42 pm »
Точнее так - возможен язык где разрешение имен таково, что у потомка может быть ЕЩЕ ОДНО поле с названием совпадающим с полем предка. В этом случае r4 будет содержать и поле r с типом r1 и поле r с типом r2, это два разных поля, то есть две независимые переменные. Изменение одного поля никак не скажется на другом.

Если все поля реализованы через указательные типы (как в oberonjs), то никто не мешает потомку расширить поле предка по все законам ООП.

vlad

  • Hero Member
  • *****
  • Сообщений: 1391
    • Просмотр профиля
Re: Уточнение поля записи типа запись
« Ответ #6 : Ноябрь 13, 2013, 02:45:05 pm »
Через указатель понятно что можно. Но это лишний объект в куче.
Вопрос именно в RECORD

Э... Ну в сях, конечно, можно без кучи :) Но лучше не надо :)

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Re: Уточнение поля записи типа запись
« Ответ #7 : Ноябрь 13, 2013, 02:58:48 pm »
Точнее так - возможен язык где разрешение имен таково, что у потомка может быть ЕЩЕ ОДНО поле с названием совпадающим с полем предка. В этом случае r4 будет содержать и поле r с типом r1 и поле r с типом r2, это два разных поля, то есть две независимые переменные. Изменение одного поля никак не скажется на другом.

Если все поля реализованы через указательные типы (как в oberonjs), то никто не мешает потомку расширить поле предка по все законам ООП.
Ну ты же понимаешь что это ничем не будет отличаться от того же, но через указатель :-)
Y = λf.(λx.f (x x)) (λx.f (x x))

vlad

  • Hero Member
  • *****
  • Сообщений: 1391
    • Просмотр профиля
Re: Уточнение поля записи типа запись
« Ответ #8 : Ноябрь 13, 2013, 03:01:11 pm »
Ну ты же понимаешь что это ничем не будет отличаться от того же, но через указатель :-)

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

Kemet

  • Hero Member
  • *****
  • Сообщений: 587
    • Просмотр профиля
Re: Уточнение поля записи типа запись
« Ответ #9 : Ноябрь 13, 2013, 06:52:44 pm »
Возникла потребность уточнить тип поля в расширении записи:
Зачем?
В своих типах, например в КП, можно использовать модификатор union, хотя это, естественно, не то. А так, нужно учитывать, что в твоём варианте мы должны поменять тип статического элемента, залезти в дескриптор типа вдажедьца, что явно приведет к проблемам.