Logo

Этюд 9. Группировка свойств класса

Этот этюд перекликается со вторым этюдом, где аналог типа WordRecиз Delphi описывался с использованием оператора частичного применения в Канторе. Сейчас же будет рассмотрен прямой аналог вариантной записи Delphi — при помощи ключевого слова else в теле класса. Поскольку все типы в Канторе являются классами, возможность группировки свойств добавлена прямо в классы, отдельный тип «запись» отсутствует.

На Delphi

Код на Delphi полностью взят из второго этюда:
type
  WordRec = packed record
    case Byte of
      0: (Lo, Hi: Byte);
      1: (Bytes: array [0..1] of Byte);
  end;

  LongRec = packed record
    case Byte of
      0: (Lo, Hi: Word);
      1: (Words: array [0..1] of Word);
      2: (Bytes: array [0..3] of Byte);
  end;

На Канторе

Предполагается, что аналогичная возможность в Канторе будет реализована ключевым словом else в теле класса:
public class ShortRec public of
  var Core:Byte Lo, Hi;
else
  var Core:Byte Bytes[2];
end;

public class LongRec public of
  var Core:ShortWord Lo, Hi;
else
 var Core:ShortWord ShortWords[2];
else
  var Core:Byte Bytes[4];
end;
Синтаксис пока сильно экспериментальный, поэтому пример схематичен.

Особености реализации

Запланированы следующие низкоуровневые возможности:
  • Выравнивание — конструкция align by.
  • Группировка только части свойств-переменных — полный аналог union из Си — конструкция group by.
Использованная в этюде конструкция с else может считаться упрощенной записью group by или ее совмещением с телом класса. Возможна также явная форма совмещения (экспериментальный синтаксис):
public class ShortRec public group by 1 of // совмещение, выравнивание
  var Core:Byte Lo, Hi; // на 1 байт
else
  var Core:Byte Bytes[2];
end;
Группировку части свойств можно показать на примере реального класса API Windows — DRIVE_LAYOUT_INFORMATION_EX:
public class DRIVE_LAYOUT_INFORMATION_EX public align by 8 of
  var Core:LongWord PartitionStyle, PartitionCount; // ^-- для IOCtrl
  group
    var DRIVE_LAYOUT_INFORMATION_MBR Mbr;
  else
    var DRIVE_LAYOUT_INFORMATION_GPT Gpt;
  end;
  var PARTITION_INFORMATION_EX PartitionEntry[1];
end;
Точная семантика предложенных тут конструкций еще должна быть доработана.

См. также

Комментариев нет :

Отправить комментарий

Выбрав в выпадающем списке пункт «Имя/URL», можно оставить комментарий от своего имени без предварительной регистрации.