Ciertamente Lazarus tiene muchas cosas de C. Si te fijas en el debugger a las direcciones de memoria en hexadecimal les coloca el prefijo 0x y no $. Eso me hace pensar que ese módulo está programado en C, si no gran parte de Lazarus.
En relación a las expresiones += ... son copiadas de C y muy útiles, así como el operador incremento (++) o decremento (--) que te permiten ahorrar líneas.
En relación a la sobrecarga de operadores, aquí tienes como lo hace para la pregunta del hilo en cuestión:
// Tomado de la unidad Math
operator ** (bas,expo : float) e: float; inline;
operator ** (bas,expo : int64) i: int64; inline;
.................................................
operator ** (bas,expo : float) e: float; inline;
begin
e:=power(bas,expo);
end;
operator ** (bas,expo : int64) i: int64; inline;
begin
i:=round(intpower(bas,expo));
end;
Muy parecido a C++, se considera una simple función.
Saludos.
Si, he visto en la unidad Math esta sobrecarga y otras más.
Lo que no me queda claro como es que se las ingenia el compilador para detectar un += o un := + y seguir funcionando tranquilamente.
Hice una prueba con este código:
procedure TForm1.Button1Click(Sender: TObject);
var i: integer;
begin
i := 5;
i += 4;
ShowMessage(IntToStr(i));
end;
He compilado el código tanto con la opción del COPERATORS desde la configuración del compilador para el proyecto (Proyecto -> Opciones del proyecto -> Opciones del compilador -> Procesado) activada como desactivada.
Le da lo mismo, el resultado es que compila y el resultado es 9.
Creo que algo tienen que ver las directivas:
Porque luego hice una prueba poniendo esto a continuación:
{$mode objfpc}{$H+}
{$COPERATORS OFF}
Y ahora al intentar compilar el código efectivamente recibo una advertencia.
Por esto, yo concluyo que la única forma segura de trabajar con los operadores C si es que uno desea usarlos es asegurarse de esté habilitada esta opción, o bien ponerlo en ON al inicio de nuestras units.
Por lo que pude leer de la doc, esta directiva de compilación permite trabajar con estos estilos: +=, -=, /= y *=. Tengo entendido que C acepta y tiene otros más, como la ** que se trata en este hilo. Al parecer el resto de operadores C se pueden (y tienen que) emular con la sobrecarga. Sería interesante tener una lista completa de los operadores que están disponibles por defecto. En la unidad Math hay unos cuantos... pero quien sabe si hay más...
Extraño la funcionalidad de "Búsqueda completa" que ofrece Delphi en Lazarus, para asi poder buscar en todo los fuentes del "Search Path" de Lazarus el término operator y recopilar la lista. Para lograr esto en Lazarus hay que tener abiertos cada unit en el IDE y si no te sabes el nombre de alguna no la busca
O al menos yo, no le vi esa opción en el Search de CodeTyphon/Lazarus.
Saludos,