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