Pull to refresh

Изменение синтаксиса 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}
Tags:
Hubs:
You can’t comment this publication because its author is not yet a full member of the community. You will be able to contact the author only after he or she has been invited by someone in the community. Until then, author’s username will be hidden by an alias.