Logo

31 января 2015 г.

Этюд 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;
Точная семантика предложенных тут конструкций еще должна быть доработана.

1 комментарий

  1. Ключевое слово align исключено из синтаксиса как избыточное, вместо него будет group.

    ОтветитьУдалить

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