On peut écrire des fonctions récursives en Pascal. Par exemple cette fonction illustre bien cette possibilité :
function factorielle(n: shortint): integer; begin if n <= 1 then result := 1 else result := n*factorielle(n-1); end;
Remarque : le nombre d'appels récursifs est limité (de même que pour de nombreux langages) par la pile d'appel.
Il est possible de définir des types génériques, c'est-à-dire pouvant être utilisés avec différent types possibles sans pour autant avoir à réécrire le code entier. Voilà un exemple en FreePascal :
type { On définit un objet qui permet d'additionner deux éléments et multiplier un élément par un entier strictement positif } { TAnneauGenerique } generic TAnneauGenerique= class function Somme(a, b: T): T; function Multiple(n: integer; a: T): T; end; { On crée deux versions spécialisées, s'appliquant aux nombre réels et aux chaines de caractères } TAnneauReel = specialize TAnneauGenerique ; TAnneauChaine = specialize TAnneauGenerique ; { TAnneauGenerique } function TAnneauGenerique.Somme(a, b: T): T; begin result := a + b; end; function TAnneauGenerique.Multiple(n: integer; a: T): T; var i: integer; begin { On ne gère que le cas où n >= 1 } result := a; for i := 2 to n do result := result + a; end; var r: TAnneauReel; c: TAnneauChaine; begin r := TAnneauReel.Create; writeln('Avec des réels:'); writeln('4.1 + 5.2 = ', FloatToStr( r.Somme(4.1, 5.2) )); writeln('3 x 5.1 = ', FloatToStr( r.Multiple(3, 5.1) )); r.free; writeln; c := TAnneauChaine.Create; writeln('Avec des chaines:'); writeln('bon + jour = ', c.Somme('bon', 'jour')); writeln('10 x a = ', c.Multiple(10, 'a')); c.free; readln; end;
Note : en Delphi, il ne faut pas ajouter les mots-clés generic et specialize.
Il est possible que les différentes unités du programmes s'utilisent mutuellement, mais il y a une limitation. En effet, en Pascal, on peut faire référence à une autre unité à deux endroits possibles, à savoir dans l'interface et à l'implémentation. Si deux unités font référence l'une à l'autre dans leur interface, on obtient une erreur de dépendance circulaire. On peut contourner ce problème en utilisant une troisième unité qui servira de base aux deux autres, et/ou en utilisant des types plus abstraits au niveau des interfaces. Cette limitation n'existe pas en Visual Basic.
Delphi ne fonctionne que sur Windows. Kylix, son équivalent officiel, tourne sous Linux et Unix. Malheureusement si Delphi continue à évoluer, le développement de Kylix a été stoppé. Par conséquent les versions supérieures à 7 de Delphi sont moins compatibles avec Kylix. Par ailleurs, la compatibilité Delphi/Kylix n'est possible qu'avec les applications utilisant la bibliothèque CLX. Les applications utilisant la VCL ne sont pas utilisables avec Kylix.
En ce qui concerne Free Pascal et Delphi/Kylix, de grands progrès ont été réalisés au niveau de la compatibilité des compilateurs. Aujourd'hui c'est près de 99% de code compatible. Toutefois, un certain nombre de remarques sont à faire :
Le projet GNU Pascal est assez peu populaire chez les amateurs de Pascal (il lui est souvent reproché par les puristes d'être écrit en C et non en Pascal comme les autres). Bénéficiant de moins de contributeurs eux-mêmes moins concernés (ils font du C), le projet ne peut se vanter des mêmes avancées que Free Pascal. Il est relativement compatible avec les anciens programmes Turbo Pascal mais n'est fourni qu'avec les bibliothèques de base, et donc limité en mode graphique. Les amateurs de fenêtres sous Lazarus ou Delphi/Kylix auront beaucoup de travail pour porter leurs programmes sous GNU Pascal.
Pour résumer si vous faites un programme compatible avec Turbo Pascal (en mode texte plus particulièrement), vous pourrez le compiler sans trop de difficultés avec le compilateur de votre choix. L'apparition des modes graphique et des fenêtres a complexifié les bibliothèques rendant la compatibilité plus difficile, mais pas impossible. Quoi qu'il en soit, plus vous utiliserez des technologies logicielles récentes, plus la compatibilité entre compilateurs (et les possibilités de portage) sera compromise.
Le portage d'application d'un système à un autre est une tâche assez difficile en Pascal. C'est la principale raison du manque de popularité de ce langage, malgré un grand nombre de qualités.
L'utilisation d'un compilateur disponible sur plusieurs plateformes facilite cette tâche. L'utilisation de fonctions spécifiques à un système est à éviter mais si c'est indispensable on peut s'inspirer du code suivant :
procedure Special(Param1, Param2: TypeParam); begin {$IFDEF Linux} {Code sprécifique à linux} {$ELSEIF} {$IFDEF Win32} {Code spécifique à Windows 32 bits} {$ELSEIF} Plateforme non supportée (texte clair non-commenté générant une erreur) {$ENDIF} {Code commun} end;
Le couple Delphi/Kylix constitue une bonne solution simple de portage Windows/Linux mais elle reste limitée à ces deux seuls systèmes, et impose l'utilisation des bibliothèques CLX. Le portage d'applications VCL vers des applications CLX est simple mais fastidieux car cela nécessite de redessiner complètement l'interface. Enfin Kylix n'étant plus développé, son usage est aujourd'hui déconseillé.
Lazarus est aujourd'hui la meilleure solution pour le développement multi-plateforme. Son compilateur, le Free Pascal compiler, est capable de générer des exécutables pour quasiment toutes les plateformes actuelles (c'est un compilateur croisé), Lazarus s'exécutant lui-même sur toutes ces plateformes. Hors utilisation de fonctions spécifiques à un système (appels directs aux bibliothèques Win32 par exemple, ou utilisation de l'assembleur), il compilera le code sans aucun problème quel que soit le système hôte et le système destinataire. Un inconvénient tout de même, Lazarus utilise, par défaut, la bibliothèque GTK en version 1.x (assez ancienne donc) en ce qui concerne les interfaces graphiques sous Linux, ce qui impose d'installer cette bibliothèque au préalable, alors qu'elle est considérée comme obsolète. Cela dit, des versions basés sur Qt 4 seront bientôt disponibles, le support de Qt 4 ayant considérablement avancé. Il est, par ailleurs, tout à fait possible de recompiler Lazarus pour qu'il utilise GTK 2 au lieu de GTK 1. La version Windows utilise directement les bibliothèques Win32 pour son affichage mais on peut aussi recompiler Lazarus pour qu'il utilise GTK 1 ou 2, ou Qt.