Formato, sangría y espacios

MQL5 se encuentra entre los llamados lenguajes de forma libre, como los similares C y muchos otros. Esto significa que la colocación de símbolos de servicio, como corchetes u operadores, y palabras clave puede ser aleatoria, siempre que se respeten las reglas sintácticas. La sintaxis sólo limita la secuencia mutua de esos símbolos y palabras, mientras que el tamaño de la sangría al inicio de cada cadena o el número de espacios entre los elementos de la sentencia no tienen ningún significado para el compilador. En cualquier lugar del texto en el que sea necesario insertar un espacio para separar unos elementos de otros, como una palabra clave de tipo variable y un identificador de variable, puede utilizarse un mayor número de espacios. Además, en lugar de espacios, está permitido utilizar otros símbolos que denoten espacio vacío, como tabulaciones y saltos de línea.

Si hay un símbolo de separación (veremos más sobre ellos en la Parte 2) entre algunos elementos de la sentencia, como una coma ',' entre los parámetros de una función, entonces no es necesario utilizar ningún espacio.

Los cambios de formato del código fuente no modifican el código ejecutable.

Básicamente, hay muchos lenguajes que no son libres. En algunos de ellos, la formación de un bloque de código, que se realiza mediante la correspondencia de llaves en MQL5, se basa en sangrías iguales desde el borde izquierdo.

Gracias al formato libre, MQL5 permite a los programadores utilizar múltiples técnicas diferentes para dar forma al código fuente con el fin de mejorar su legibilidad y visibilidad y facilitar la navegación interna.

Veamos algunos ejemplos de cómo se puede grabar el texto fuente de la función Greeting desde nuestro script, sin cambiar su intención.

Aquí está la versión más "empaquetada" sin espacios ni saltos de línea excesivos (un salto de línea, denotado aquí con el símbolo '\', sólo se añade para cumplir con las restricciones sobre publicación de códigos fuente en este libro).

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

Esta es la versión, en la que se insertan espacios y saltos de línea excesivos.

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

MetaEditor dispone de un estilizador de código integrado que permite formatear automáticamente el código fuente del archivo actual conforme a alguno de los estilos admitidos. Se puede seleccionar un estilo específico en el cuadro de diálogo Tools -> Settings -> Styler. El estilo se aplica mediante el comando Tools -> Styler.

Debe tener en cuenta que su libertad de espaciado es limitada. En particular, no puede insertar espacios en identificadores, palabras clave ni números. De lo contrario, el compilador no podrá reconocerlos. Por ejemplo, si insertamos sólo un espacio entre los dígitos 2 y 4 en el número 24, el compilador devolverá un montón de errores al intentar compilar el script.

He aquí una cadena modificada incorrectamente a sabiendas:

return messages[hour % 2 4 / 8];

Aquí está el registro de errores:

'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

Los mensajes del compilador no siempre son claros. Hay que tener en cuenta que, incluso en el primer error (en sucesión), existe una alta probabilidad de que la representación interna del programa (tal y como la percibió el compilador en «mitad de la frase») difiera considerablemente de lo que el programador ha sugerido. En concreto, en este caso, sólo el primer y el segundo error contienen la clave para entender el problema, mientras que todos los demás se propagan.

Según el primer error, el compilador esperaba encontrar el símbolo de una operación entre 2 y 4 (ya que percibe 2 y 4 como dos números diferentes y no como 24 separados por un espacio). La lógica alternativa consiste en que aquí se omite un corchete de cierre y el compilador muestra el segundo error: «'[' - paréntesis izquierdo desequilibrado». Después de ejecutarse, la expresión queda completamente destruida, por lo que el número 8 y el corchete de cierre ']' aparecen como inapropiados para el compilador. Pero, de hecho, si suprimimos simplemente el espacio excesivo entre 2 y 4, la situación se normalizará.

Por supuesto, es mucho más fácil realizar un análisis de errores de este tipo cuando hemos añadido el problema de forma intencionada. No siempre entendemos en la práctica cómo solucionar esta o aquella situación. Incluso en el caso anterior, suponiendo que haya recibido este código roto de otro programador y los elementos del array no contengan información tan trivial, es fácil sospechar otra opción de corrección: debe quedar el 2 o el 4, ya que probablemente el autor haya querido sustituir un número por otro y no ha limpiado las «huellas».