Procédure et fonctions

Les procédures et fonctions permettent de regrouper des portions de code de manière standardisée et réutilisable.

procedure <nomProcedure>[(parametre1 : typeParamètre1[;parametre2...]];
function <nomProcedure>[(parametre1 : typeParamètre1[;parametre2...]] : typeResultat;

Une procedure ne renvoie pas de résultat, une function en retourne un.

Il peut y avoir un nombre quelconque de paramètres, ceux ci peuvent être préfixés par const, indiquant par là qu'ils seront constant dans le contexte de la procédure, ou par var, afin de signifier qu'il sont passés par référence (une modification dans le contexte de la procédure modifiera la variable passée en paramètre). Le prefixe lazy permet de passer un paramètre en évaluation retardée. Il est aussi possible de spécifier une valeur par défaut pour un paramètre avec l'opérateur =, cette valeur par défaut devra être une constante.

Dans le cas d'une function, la valeur de retour est a placer dans la variable spéciale Result, il est aussi possible de spécifier une valeur de retour et de quitter la fonction directement avec Exit.

function Ajoute(valeur : Integer; operande : Integer = 1) : Integer;
begin
   Result:=valeur+operande;
end;

PrintLn(Ajoute(1, 10)); // affichera 11
PrintLn(Ajoute(1)); // affichera 2

Qualificateurs

deprecated

Le qualificateur deprecated peut être utilisé, en conjonction avec une chaîne optionnelle décrivant la raison de la dépréciation.
Il est typiquement utilisé pour indiquer qu'une fonction ne devrait plus être utilisée et/ou a été remplacée par une autre, sans pour autant interdire la compilation. L'utilisation d'une fonction dépréciée générera un avertissement lors de la compilation.

forward

Il est possible de qualifier avec un forward, cela indique qu'il s'agit d'une déclaration uniquement, sans implémentation. L'implémentation devra être présente plus tard dans le script. Cela peut être utilisé notamment dans le cas ou deux procédure s'utilisent mutuellement, ou pour regrouper une liste de déclaration en tête d'un script par exemple.

overload

Permet de définir une surcharge de la fonction. Le nombre ou le type des paramètres est utilisé pour différencier les surcharges.

Contrats

La programmation par contrats est supportée pour les procédures, fonctions et méthodes.
Les préconditions se définissent dans une section require, les postconditions dans une section ensure, elle sont définies comme étant une liste de prédicats (booléens) à vérifier:

prédicat_booléen [: libellé];

Un libellé peut être optionnellement spécifié, s'il n'est pas spécifié, le texte prédicat sera repris automatiquement.

function Ajoute(valeur : Integer; operande : Integer) : Integer;
require
   valeur > 0;
   operande <> 0 : 'operande ne doit pas être à zéro';
begin
   Result:=valeur+operande;
ensure
   Result > valeur;
end;

Dans les postconditions, il est possible d'utiliser le mot clef old pour désigner la valeur qu'avait une expression au début de l'exécution, une variable cachée sera automatiquement générée.

Si une condition n'est pas vérifiée, une exception EAssertionFailed sera déclenchée, dont le message indiquera la condition problématique, en reprenant son emplacement (ligne, fichier), et son libellé.

Contrats et héritage

Dans le cas de méthode virtuelles, conformément au principe de Liskov, les préconditions ne peuvent être définies que sur la méthode racine.
Les postconditions quand à elles sont prises en compte sur tout l'arbre d'héritage.