Les fonctions (corps de méthodes) externalisées font généralement appel à des services de DIESE. Parmi les plus fréquemment utilisés figurent les services des sous-classes de Method qui renvoient l'objet (entité, processus, ) dont l'instance de Method est un attribut fonctionnel. Dans notre exemple, on utilise le service DescribedDiscreteProcess de la classe ProcessMethod. Y figurent aussi les services de la classe Method qui renvoient les arguments (instances d'Argument) de la méthode. Il se trouve que la méthode choisie pour notre exemple (ExecProcess) ne possède pas d'argument.
Voici le code de la routine perl réalisant le même effet que la fonction SetCommand_Exec :
use bdiese; use appli; sub freinageAcceleration_execProcess { $pM = @_[0]; $pP = bdiese::ProcessMethod_DescribedDiscreteProcess($pM); $pDriver = bdiese::Process_ProcessedEntity($pP); $pCar = bdiese::Entity_GetSuperEntity($pDriver); $X = bdiese::Entity_GetFloatValue($pCar, $appli::POSITION); $V = bdiese::Entity_GetFloatValue($pCar, $appli::SPEED); $frontiere = - 0.06*$X**2 - 0.03*$X + 0.01; if($V < $frontiere) { bdiese::Entity_SetValue($pDriver, $bdiese::COMMAND, -1); } else { bdiese::Entity_SetValue($pDriver, $bdiese::COMMAND, +1); } }On a de fait illustré les quelques règles de transcription du code C++, en général préexistant, en code perl :
- tous les objets (variables, classes, méthodes, éléments d'énumération, ) de l'espace d'adressage C++ sont préfixés par le nom d'un module concaténé avec la chaîne ::. Le nom de ce module est soit bdiese si l'objet est déclaré dans la bibliothèque DIESE, soit un autre nom si l'objet est déclaré dans le code propre du simulateur ; on dira plus loin la raison de cela et comment ce dernier nom est attribué,
- les méthodes sont désignées par un identificateur construit par concaténation du nom de la classe C++ dans laquelle la méthode est déclarée, du signe '_' (code ascii 95) et du nom de la méthode (attention ! il s'agit du nom C++ et pas du nom de classe).
- toute méthode ainsi désignée prend en premier argument explicite l'objet auquel elle est appliquée. Autrement dit : la variable perl correspondant à l'objet C++ auquel est appliquée la méthode dans le code C++.
- on rappelle enfin que l'identificateur d'une variable perl débute toujours par le caractère $.
Reste à dire qu'au-delà du respect de ces règles d'écriture, il existe une autre condition pour que l'interpréteur perl sache reconnaître et manipuler les objets et services de DIESE : on doit avoir intégré dans le code exécutable du simulateur des "versions" des objets C++ spécialement "équipées" à cet effet. Cet "équipement" a lieu dans les procédures de compilation et d'édition de liens, celle de la bibliothèque DIESE pour les services qu'elles fournit, ou bien celle du simulateur pour les autres objets et services. Les objets équipés sont placés dans des librairies (les modules) qui faut charger en préambule du fichier des routines, à l'aide de la directive use <module>. La page suivante expose comment satisfaire cette condition.