Pascal – operator overloading

Várias são as linguagens nas quais podemos fazer overload de funções; esta funcionalidade permite que uma função possua várias versões que admitam diferentes conjuntos de argumentos, ficando o compilador encarregue de seleccionar qual dos overloads é o correcto aquando da invocação dessa função. Uma das linguagens com essa capacidade é o Object Pascal moderno.

Em Pascal, este tipo de polimorfismo também se aplica aos operadores, os quais podem de igual forma ser overloaded.

Na definição da linguagem Pascal segundo a documentação do Free Pascal, os tokens (palavras que constituem o código do nosso programa) podem pertencer a várias categorias, cada uma delas com funções ou características particulares. Uma dessas categorias é a dos operadores, os quais são um símbolo ou conjunto de dois símbolos, com uma função específica, admitindo um ou dois operandos e devolvendo um resultado. Os operadores são habitualmente funções com nomes e sintaxe especiais (nomes compostos por símbolos e invocação infixa, por oposição à tradicional invocação prefixa).

Dentro destes operadores, muitos deles podem ser overloaded, permitindo ao  programador defini-los para novos tipos de operandos, e com comportamentos diferentes do habitual, aumentando assim a expressividade do código. A isto chamamos operator overloading, objecto de estudo do presente artigo.

Todo o código do artigo foi compilado com Free Pascal Compiler, versão 2.6.2,  em ambiente GNU/Linux (Ubuntu 12.04 LTS).

 Overload de operadores aritméticos

Nem todos os operadores podem ser overloaded, mas os mais comuns podem: os operadores de atribuição, aritméticos e de comparação.

Vamos partir de casos práticos para entender como se faz overload de operadores em Free Pascal. Imagine-se, por exemplo, que pretendemos multiplicar os valores de um array de números inteiros, do tipo Integer, por um número também ele Integer, retornando um novo array.

Regra geral, o que nós fazemos é iterar pelos elementos do array, aplicando o dito cálculo. O resultado pode ficar no mesmo array ou ser atribuído a um novo. Decerto o leitor já teve situações nas quais necessitou de realizar aplicação de cálculos simples a um array e tornou-se possivelmente cansativo implementar estes ciclos, mesmo com recurso a funções.

Com a capacidade de overloading dos operadores torna-se possível reduzir o ruído do código. Para tal, implementamos numa unit os overloads que nos forem úteis.

Publicado na edição 44 (PDF) da Revista PROGRAMAR.