Dans cette page, on considèrera pour exemple la fonction SetCommand_Exec qui code dans le fichier UserDiscreteProcess.cc la détermination de la commande (freinage / accélération) dans l'application du toboggan (voir la page 'Présentation générale et exemples')). Elle est affectée par SetExec au corps de l'instance de la méthode prédéfinie ExecProcess attachée au processus SetCommand lors de la construction de celui-ci.
Ecrire la routine perl
... et la placer dans un fichier <nom_fichier>.pl dont on dira plus loin comment il est exploité par le simulateur. L'ossature du code est la suivante :
sub freinageAcceleration_execProcess { $pM = @_[0]; ... }Le code complet sera donné dans la page qui indique la manière d'appeler des services de DIESE dans le code perl.
Noter cependant ici que la routine perl reçoit de DIESE en argument implicite le pointeur sur l'instance de Method qui est l'argument explicite de la fonction SetCommand_Exec. Le langage perl référence cet argument par @_[0]. On affecte cette valeur à la variable locale $pM (noter que perl préfixe toute variable par le caractère 'dollar'). \
Noter encore la règle de nommage de la routine perl. Alors que le nom de la fonction C++ est libre (le nom choisi devient l'argument de la méthode SetExec dans le constructeur du processus), le nom de la routine doit être d'une des deux formes suivantes :
- pour les méthodes prédéfinies : la concaténation du nom de classe de l'objet (processus, événement, ), du signe '_' (code ascii 95), du nom de classe de la méthode et enfin de la chaîne _Body.
- pour les méthodes non prédéfinies : la concaténation du nom de classe de la méthode et de la chaîne _Body.
Doter le simulateur d'un interpréteur perl
La routine perl, bien qu'écrite, n'est pas d'une utilisation obligatoire. Si un interpréteur perl n'a pas été créé, ou s'il a été créé en lui donnant l'adresse d'un autre fichier que celui dans lequel on a rangé la routine, alors DIESE continue d'invoquer la version compilée (SetCommand_Exec).
Pour créer un interpréteur, il suffit d'invoquer le service DIESE NewPerlInterpreter.
Attention ! La fonction NewPerlInterpreter associe un fichier à l'interpréteur. Ce fichier est bien sûr celui mentionné après le mot-clé PERL_FIC dans la phrase ci-dessus. L'invocation explicite dans le programme principal doit être précédée de la désignation de ce fichier. Cela se fait par l'instruction suivante :
- soit explicitement dans le programme principal, normalement en son début, et en tous cas avant ce qui aurait été la première invocation de SetCommand_Exec,
- soit implicitement et automatiquement, en utilisant l'option PERL_FIC dans la phrase INITIALISATION SIMULATION du fichier des spécifications de la simulation (voir page 'Le fichier des spécifications de simulation'). Ce qui s'écrit ainsi :
INITIALISATION SIMULATION .... // autres options PERL_FIC "../perl/toboggan.pl"; // contient la routine perl ;pCurrentSim->SetPerlFile("../perl/toboggan.pl");La version courante de DIESE ne sait gérer qu'un seul interpréteur à la fois, et cet interpréteur ne peut accéder qu'à un seul fichier à la fois. Cependant, il est possible de diriger l'interpréteur sur plusieurs fichiers successivement : dans DIESE, il faut le supprimer (voir plus loin) puis le créer à nouveau en l'associant à un fichier différent.
Exploiter les services DIESE d'interprétation de routines perl
Pour notre exemple, ceci est réalisé par l'appel suivant :
PerlVoidFunction(str, pM);où :
\indent str est le nom de la routine perl. Ici : "freinageAcceleration_execProcess" \ \indent pM est l'instance de Method qui sera passée à la routine perl en argument implicite de rang 0, autrement dit l'instance de Method (du processus) dont le corps est externalisé. Ici, c'est l'instance de la classe prédéfinie ExecProcess qui a reçu comme corps compilé la fonction SetCommand_Exec. \L'appel ci-dessus est construit et réalisé automatiquement par DIESE, plus précisément par les services tels que ExecVoidMethod de la classe Process, lequel est justement celui qui est invoqué dans notre exemple, puisque la méthode prédéfinie en question possède un corps de type void (voir la classe Process, page 'Affectation d'un corps aux méthodes', et 'Méthodes prédéfinies de processus/Exécution d'un processus discret'). \
Quant à l'appel à ExecVoidMethod, il est fait lui aussi automatiquement dans la méthode du moteur de simulation qui réalise l'exécution de l'effet d'un processus ponctuel, lors du dépilement de l'événement correspondant. En fait, l'exploitation des services d'interprétation de routines perl est entièrement pris en charge par DIESE pour les méthodes prédéfinies. Par contre, le développeur doit invoquer lui-même les services tels que ExecVoidMethod pour les méthodes non prédéfinies.
Supprimer l'interpréteur perl
Lorsque plus aucun appel à l'interpréteur perl ne doit être fait, il est bon de le supprimer, par une invocation de DeletePerlInterpreter. Un tel appel est fait automatiquement dans le destructeur de la simulation courante (pCurrentSim) si un interpréteur a été créé. On sait qu'on libère la mémoire occupée par pCurrentSim par un appel explicite delete pCurrentSim; dans le programme principal, ou bien, dans un fichier de directives de la simulation, par une directive DELETE SIMULATION ou DELETE ALL.