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

в 0:00, , рубрики: Песочница

Речь в статье пойдет о составных операторах 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}

Автор: Возле ректора

Источник

* - обязательные к заполнению поля