5.3 Fonctions Scilab

Définir de nouvelles fonctions dans Scilab se fait au moyen de la construction syntaxique suivante :

 
function [<nom1>,<nom2>,...]=<nom-de-fonction>(<arg1>,<arg2>,...) 
   <instructions>
endfunction

Dans la définition de la fonction on précise bien sûr le nom de la fonction, la liste de ses arguments d'entrée et la liste des arguments de sortie. On notera qu'une fonction peut renvoyer plusieurs valeurs. L'appel d'une fonction se fait de la façon suivante :

 
   <nom-de-fonction>(<expr1>,<expr2>,...)
ou encore :
 
  [<v1>,<v2>,...<vp>]=<nom-de-fonction>(<expr1>,<expr2>,...)
Dans le premier cas la valeur retourné par la fonction est la première valeur de retour et dans le deuxième cas ce sont les p premières valeurs de retour qui sont affectées aux variables <v1>, <v2>,...,<vp>. Lors de l'appel de la fonction les expressions fournie en arguments sont d'abord évaluées et leur valeurs sont passées a l'environnement d'exécution de la fonction sous les noms <arg1>, <arg2>,.... Les arguments des fonctions sont donc passés par valeurs quel que soit leur type. Notons toutefois que, si un argument est un nom de variable, la variable ne sera pas copiée si dans le corps de la fonction la variable correspondante n'est jamais modifiée.

L'exécution d'une fonction se termine normalement quand tout le bloc <instructions> a été exécuté, mais elle peut aussi se terminer si l'exécution du corps de la fonction conduit à une instruction return. Le retour de la fonction à lieu alors immédiatement après l'instruction return. Les variables de retour <nom1>,<nom2>,... ont alors la valeur courante qu'elles avaient dans l'environnement d'exécution de la fonction.


\begin{sessioncmd}
\par -->function y=f(x); y=2*x;endfunction \sleftarrow{\norma...
...on peut changer l'ordre dans lequel on donne les arguments}
\par\end{sessioncmd}

Comme on l'a vu une fonction admettant $ n$ variables en entrée et retournant $ p$ valeurs en sortie peut être appelée avec moins d'arguments d'entrée et le nombre de valeurs de retour demandées peut être inférieur à $ p$. Il est possible de contrôler les valeurs utilisées dans un appel de fonction au moyen de la fonction argn. . En effet une ligne d'instruction [lhs,rhs]=argn() permet d'obtenir dans les variables lhs (resp. rhs) le nombre de valeurs de retour (resp. d'entrée) utilisées. Cela permet de gérer des arguments optionnels comme illustré sur l'exemple suivant. On notera sur cet exemple que l'on peut utiliser la fonction error pour produire une erreur Scilab.


\begin{sessioncmd}
\par -->function [u,v]=f(x,y)
--> [lhs,rhs]=argn(0)
--> if rh...
...list(1,2,3)
-->endfunction
Warning :redefining function: f
\par\end{sessioncmd}

Normalement le nombre d'argument d'entrées doit être inférieur ou égal au nombre d'argument d'entrée de la fonction appelée. Il y a une exception à cela. Si le dernier argument d'une fonction comportant $ n$ arguments d'entrées à pour nom varargin alors la fonction peut être appelée avec plus de $ n$ arguments. Les arguments fournis à partir du $ n$-ième sont stockés dans une liste Scilab de nom varargin.



Une fonction Scilab peut utiliser les variables courantes de l'environnement d'appel mais en lecture seulement. Il est possible de modifier une variable de l'environnement d'appel que pour un ensemble particulier de variables dites globales. Les variables globales doivent être déclarées dans l'environnement initial au moyen de la fonction global, et pour être utilisée en écriture elle doivent aussi être déclarées dans les fonctions qui peuvent changer leurs valeurs


\begin{sessioncmd}
\par -->global a; \sleftarrow{\normalfont\verb+a+ est mainten...
...\verb+f+ a changé \verb+a+}
a =
\par ! 2. 7. 0. 3. !
\par -->
\end{sessioncmd}