Fonctions
 Une fonction est un moyen de réutiliser une partie de code et d'étendre le langage.
  En passant des paramètres à une fonction, on peut adapter le processus à différents cas. C'est la mission du programmeur de décider comment diviser un traitement en fonctions.
 Le langage Scriptol dispose d'une quantité de fonctions intégrées, et il utilise directement les fonctions de la librairie du langage cible, soit Php, ou C++.
Dans ce chapitre nous verrons comment définir de nouvelles fonctions.


Définir une fonction

Une fonction commence avec une interface qui définit comment elle doit être appelée, suivi par un bloc d'instructions, et terminé par le mot-clé "return" (retour).

type [type]* nom ( argument [, argument]* ) [:]
... instructions ...
return [type [, type]*]

Ce qui signifie ceci:
- un ou plusieurs types de retour,
- suivi du nom de la fonction,
- puis entre parenthèses, un ou plusieurs arguments.
- dans le corps de la fonction, des instructions,
- le mot clé return suivi du même nombre d'arguments défini plus haut.

Le symbole : est optionnel après les arguments, c'est un séparateur que l'on l'utilise que s'il y a une instruction sur la même ligne (et si cette instruction ne commence par par un mot-clé).

A l'intérieur du corps d'une fonction, vous pouvez mettre toute instruction, sauf une déclaration de haut niveau (classe, enum) ou une autre fonction. Vous pouvez avoir plusieurs instructions de retour et toutes doivent avoir les mêmes types d'objets définis dans l'en-tête de la fonction.

Exemple simple de fonction int multiply(int x, int y)
  int z
  z = x * y
return z

Cela pourrait être écrit plus simplement:
int multiply(int x, int y)
return x * y

Fonction ne retournant rien

Si la fonction ne retourne aucune valeur, le type de retour est void, et l'instruction return n'a pas de paramètre.

Fonction ne retournant rien void disp(text t)
  print "un texte:", t
return


Valeurs multiples

 Si la fonction retourne plusieurs valeurs, elle doit avoir plusieurs types de retour et l'instruction de retour à plusieurs paramètres (dans le même ordre que les types de retour).

Fonction retournant deux valeurs int, int coordonnees(int num)
  int x = matable[num].x
  int y = matable[num].y
return x, t


Revenons sur return

Quelque fois le code de fin d'une fonction semble inutile.

Exemple de fonction int ajouteabs(int x, int y)
  if y < 0
     return
x - y
  else
     return x + y
  /if
return 0


 L'instruction return terminale n'est jamais atteinte, mais elle est néammoins requise, et elle doit avoir le format correct en fonction selon l'interface défini en première ligne.
Il est toujours possible de réécrire plus simplement un cas de ce genre, comme le montre l'exemple encadré.

Fonction simplifiée int ajouteabs(int x, int y)
  if y < 0  return x - y
return x + y


Scope et fonction

Le scope est un niveau de l'espace de visibilité des objets déclarés.
Une fonction ouvre un nouveau scope pour toutes les variables déclarées à l'intérieur. Si la fonction est dans le scope global, toutes les variables globales compilées avant la fonction sont visibles dans la fonction.
On ne peut redéclarer dans la fonction une variable avec le même nom qu'une variable globale.
Si la fonction est une méthode d'une classe, toutes les variables déclarées dans la classe avant la fonction sont visibles dans la fonction.
Les variables et instances déclarés dans la fonction sont visibles dans les scopes intérieurs, autrement dit dans les structures de contrôle à l'intérieur de la fonction.


 Exercices

1) Voici un petit script, qui calcule la puissance n ième d'un nombre réel.
Afin de pouvoir réutiliser ce code dans d'autres programmes, le transformer en fonction, que l'on nommera "puissance".
 Appeler la fonction avec les valeurs données dans le source ci-dessous.

real x = 2.0
int y = 3
real z = x

while y > 0
   z * x
let y - 1

print z

Réponse

2) Indiquez les déclarations valides ou invalides dans le code ci-dessous...

int x = 1, y = 2, z = 3

int unefonction(int x)
  int z, k = 0
  x = x * y
  if x > 5
    int k = 2
    int m
   m = x + k + 1
  /if
return m

Réponse