Logo

27 ноября 2013 г.

Строчные и блочные объявления

Операторы в языке Кантор могут иметь строчную или блочную запись. В строчной форме записываются простые выражения и кортежи, а в блочной — все остальные операторы. Вне зависимости от формы записи операторы разделяются точкой с запятой.

В этой статье рассматривается только декларативный синтаксис.

Выражения и кортежи

Во многих случаях строчная форма является естественной для выражений и кортежей. Чаще всего это описания простых функций, в том числе переменных, рассматриваемых в языке Кантор как функции:
a = 5;                     // простая функция
[c, d] = [100, 'пятьсот']; // кортеж
plus2[int val] = val + 2;  // с параметром

var s = 'строка', x = 100; // кортеж инициализированных переменных
Строка в строчной записи — понятие условное. Строчный оператор может занимать сколько угодно строк исходного текста, завершаясь точкой с запятой. Несколько объявлений, разделенных запятой, превращают оператор в кортеж (в терминах языка Кантор). Объявление параметров функций — особый вид кортежа, он будет рассмотрен отдельно.

Блочные объявления

Бывает так, что идущие друг за другом объявления образуют логический блок, который хотелось бы выделить синтаксически, но строчная запись, наоборот, только усложняет восприятие, вытягивая описание в строку и делая его невыразительным. Если оператор разбить на строки и в строчном синтаксисе, отдельные объявления будут завершаться запятой, а последнее объявление — точкой с запятой, что нелогично:
var Byte HeaderVersion = 1;
var Word[32] ImageStart = 16, ImageEnd = 768,
  MemSize = 8192, StackSize = 4096,
  ParamCount = 0;
var HasIcon = false;
Для таких случаев в Канторе предусмотрена блочная форма объявления, объединяющая функции одного типа и/или с одним набором модификаторов в блок of..end, внутри которого отдельные объявления единообразно разделяются точкой с запятой:
var of
  Byte HeaderVersion = 1;
  Word[32] of
    ImageStart = 16;
    ImageEnd = 768;
    MemSize = 8192;
    StackSize = 4096;
    ParamCount = 0;
  end;
  HasIcon = false;
end;
Блоки могут произвольно вкладываться друг в друга, модификаторы при этом суммируются, а взаимоисключающие — перекрываются (еще не решено окончательно).

Несмотря на разность записи, в обоих случаях объявляется несколько самостоятельных функций-переменных, не объединенных ни в какую структуру: HeaderVersion, ImageStart, ImageEnd, MemSize, StackSize, ParamCount, HasIcon.

Запланировано, что на уровне байт-кода оба описания будут абсолютно идентичны, и при отекстовке байт-кода можно будет выбрать предпочитаемую форму — строчную или блочную.

Блоки локальных функций

Другой случай, когда полезен блок объявлений — ограничение видимости локальных имен. Для этого служит оператор-префикс with. Он может предшествовать любому блочному оператору, ограничивая область видимости объявленных в нем имен только этим оператором. С ключевым словом do блок with можно использовать и со строчными объявлениями:
a = 50;
with
  a = 2;
  b = 20;
do
  rslt = a * b;  // = 40
end;
В данном примере на внешнем уровне видны только две функции-константы: a, равная 50, и rslt, равная 40.

Блоки with также могут вкладываться друг в друга.

Синтаксис блочных операторов

Блочные операторы могут быть «многоэтажными», при этом каждая часть имеет блочную запись с разделением вложенных операторов точкой с запятой. Завершается блочный оператор ключевым словом end, после которого ставится точка с запятой — разделитель операторов.

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

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

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