Форматирование, отступы и пробелы

Язык MQL5 относится к числу языков со свободным форматированием (free-form), как C-подобные и многие другие языки. Это означает, что размещение служебных символов (например, скобок, операторов) и ключевых слов может быть произвольным, при условии соблюдения синтаксических правил. Синтаксис ограничивает только взаимную последовательность этих символов и слов, а размер отступов в начале каждой строки исходного текста или количество пробелов между составными элементами инструкции не имеют для компилятора никакого значения. В любом месте текста, где нужно вставить пробел, чтобы разделить элементы языка (например, ключевое слово с названием типа переменной и идентификатор переменной), можно использовать большее количество пробелов. Более того, вместо пробелов разрешено применять другие символы, обозначающие пустое пространство, такие как табуляция и перевод строки.

Если между некоторыми элементами инструкции уже есть какой-либо символ-разделитель (мы узнаем подробности о них во второй части), такой как запятая ',' между параметрами функции, то использовать пробел вовсе не обязательно.

Исполняемый код при изменении форматирования исходного текста не меняется.

В принципе, существует множество языков, не являющихся свободно-форматируемыми. В некоторых из них формирование блока кода, которое производится в MQL5 с помощью парных фигурных скобок, основывается на равных отступах от левого края.

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

Рассмотрим несколько примеров того, как можно записать исходный текст функции Greeting из нашего скрипта, не меняя её сути.

Вот максимально "упакованная" версия вообще без лишних пробелов и переводов строк (перевод строки, обозначенный здесь символом '\', сделан только для соблюдения ограничений, накладываемых на публикацию исходных текстов в данной книге).

string Greeting(int hour){string messages[3]={"Good morning",\
"Good day","Good evening"};return messages[hour%24/8];}

Вот версия, где наоборот вставлены лишние пробелы и переводы строк.

string
Greeting ( int hour )
  {
    string messages [ 3 ]
            = {
                "Good morning" ,
                "Good day" ,
                "Good evening"
              } ;
      
    return messages [ hour % 24 / 8 ] ;
  }

MetaEditor имеет встроенный стилизатор кода, который позволяет автоматически отформатировать исходный код текущего файла в соответствии с одним из поддерживаемых стилей. Выбор конкретного стиля осуществляется в диалоге Сервис -> Настройки -> Стилизатор. Применение стиля выполняется с помощью команды Сервис -> Стилизатор.

Следует иметь в виду, что свобода расстановки пробелов имеет ограничения. В частности, нельзя вставлять пробелы внутрь идентификаторов, ключевых слов или чисел — так компилятор не сможет их распознать. Например, если вставить хоть один пробел между цифрами 2 и 4 в числе 24, компилятор выдаст кучу ошибок при попытке откомпилировать скрипт.

Вот заведомо неправильно модифицированная строка:

return messages[hour % 2 4 / 8];

А вот журнал с ошибками:

'GoodTime2.mq5'        GoodTime2.mq5        1        1
'4' - some operator expected        GoodTime2.mq5        19        28
'[' - unbalanced left parenthesis        GoodTime2.mq5        19        18
'8' - some operator expected        GoodTime2.mq5        19        32
']' - semicolon expected        GoodTime2.mq5        19        33
']' - unexpected token        GoodTime2.mq5        19        33
5 errors, 0 warnings                6        1

Сообщения компилятора могут выглядеть не всегда понятно. Следует учитывать, что уже после первой (по порядку) ошибки велика вероятность, что внутреннее представление программы (как её "на полуслове" воспринял компилятор) существенно отличается от предполагаемого программистом. В частности, в данном случае только первая и вторая ошибки содержат ключ к пониманию проблемы, а все остальные являются наведенными.

Согласно первой ошибке, компилятор ожидал найти между 2 и 4 символ какой-нибудь операции (т.к. 2 и 4 расцениваются им, как два разных числа, а не разделенное пробелом 24). Альтернативная логика заключается в том, что в данном месте пропущена закрывающая квадратная скобка, и компилятор выдал вторую ошибку — "не хватает парной скобки для '['". После этого разбор выражения окончательно рушится, в результате чего последующие число 8 и закрывающая скобка ']' кажутся компилятору также неуместными. А на самом деле, достаточно убрать лишний пробел между 2 и 4, и ситуация нормализуется.

Разумеется, такой анализ ошибок гораздо проще делать, когда мы сами намеренно внесли проблему. На практике не всегда удается понять, как именно следует исправлять ту или иную ситуацию. Даже в рассмотренном выше случае, если предположить, что Вы получили данный испорченный исходный код от другого программиста и элементы массива содержат не столь тривиальную информацию, легко заподозрить другой вариант исправления: нужно оставить либо 2, либо 4, потому что, вероятно, автор хотел заменить одно число на другое и не "подчистил следы".