Изменение синтаксиса Free Pascal при помощи макросов

Речь в статье пойдет о составных операторах begin-end, форматировании кода и синтаксисе языка Pascal. А начнем мы с цитаты из книги Стива Макконнелла «Совершенный код».


«Большинство споров по поводу форматирования возникает из-за несовершенства большинства популярных языков программирования. Хорошо спроектированный
язык имеет явную структуру блоков, которая приводит к естественному стилю отступов.»

Рассмотрим пример кода на Pascal.


if A > 2 then
begin
  X := X + 1;
  Y := Y + 2;
end
else
begin
  X := X - 1;
  Y := Y - 2;
end;

На языке, который имеет явную структуру блоков, этот же фрагмент кода можно было бы написать так:


if A > 2 then
  X := X + 1;
  Y := Y + 2;
else
  X := X - 1;
  Y := Y - 2;
end;

Второй фрагмент чище и изящнее, но он не работает в языке Pascal. Попробуем сэмулировать явную структуру блоков с помощью макросов Free Pascal. Сначала включим поддержку макросов:


{$MACRO ON}

А затем определим два макроса:


{$define then_:=then begin}
{$define else_:=end else begin}

Что мы сделали? По сути мы добавили два ключевых слова: then_ (заменяется на then begin) и else_ (заменяется на end else begin). Теперь наш фрагмент кода будет выглядеть так:


if A > 2 then_
  X := X + 1;
  Y := Y + 2;
else_
  X := X - 1;
  Y := Y - 2;
end;

И это работает в Free Pascal! Продолжим усовершенствовать оператор if. Часто используется цепочка операторов if-else-if — конструкция, состоящая из вложенных операторов if. Добавим новый оператор elsif, так как elsif не является зарезервированным словом языка Pascal, нижнее подчеркивание не нужно.


{$define elsif:=end else if}

Пример использования:


if A > 2 then_
  X := X + 1;
  Y := Y + 2;
elsif A < 1 then_ 
  X := X - 1;
  Y := Y - 2;
end;

В результате мы получили новый синтаксис для оператора if:


if Условие then_
  Операторы
elsif Условие then_
  Операторы
elsif Условие then_
  Операторы
...
else_
  Операторы
end;

Похожий синтаксис реализовал Никлаус Вирт (создатель языка Pascal) в своих последующих языках Модула-2 и Оберон. А мы благодаря макросам можем пользоваться им в Free Pascal.


Добавив еще одно ключевое слово do_ (заменяется на do begin):


{$define do_:=do begin}

мы изменим синтаксис циклов и других конструкций, в которых используется ключевое слово do. Пример использования:


while X < 10 do_
  X := X + 1;
  Y := Y + 2;
end;

Для тех, кто решится попробовать новый синтаксис, вот полный список макроподстановок. Кстати, в среде разработки Lasarus, можно в настройках добавить дополнительные ключевые слова, и в редакторе они будут выделяться жирным шрифтом.


{$MACRO ON}
{$define then_:=then begin}
{$define else_:=end else begin}
{$define elsif:=end else if}
{$define do_:=do begin}
Метки:
pascal, free pascal