Orientation but, asynchrone ou synchrone

Cette structure de contrôle ajoute au langage Scriptol l'orientation but, elle lance une procédure qui s'exécute de façon asynchrone.

Elle fonctionne sur des variables globales ou des objets. La syntaxe est la suivante:

to ...condition... for durée [, délai ]
  ...processus...
/to

Le compilateur reconnaît aussi la syntaxe en une ligne:

to ...condition... for ...durée [, délai]. do ...action... 

Condition

La condition est une expression relationnelle qui est définit le but à atteindre. Par example:

a >= 100

On accomplit une action de façon répétive jusqu'à ce que la valeur de la variable global soit 100.

Durée

Le durée est le temps limite exprimé par un nombre réel en secondes durant lequel s'effectuer le traitement. Ce peut être un nombre entier ou un nombre réel, mais toujours un littéral.
Si on ne veut pas de temps limite, on écrit le symbole & pour représenter l'infini.

Délai

Ce paramètre est optionel. Il impose un temps d'attente exprimé par un nombre entier en millisecondes entre deux itérations de l'action. Par défaut il n'y a aucun délai.

Action

L'action est un bloc d'instructions défini pour tenter d'atteindre le but, le bloc est exécuté de façon répétitive comme dans une itération (mais ce n'en est pas une, on est en mode asynchrone).

On peut aussi tenter de maximiser une valeur. Dans ce cas, lorsque la durée limite est atteinte, on termine avec la valeur la plus proche du but donné.

Tout ceci fonctionne de façon asynchrone: si vous définissez plusieurs buts dans un programme, les actions s'éffectuent en même temps, par conséquent elle doivent opérer sur des variables indépendantes.

Ce n'est vraiment la concurrence, même si cela y ressemble. Le code JavaScript généré est basé sur les fonctions setInterval et setTimeout. Cette structure de contrôle convient aux simulations et au contrôle d'un robot pour commander des éléments ou des parties et les faire tendre chacun vers un but, indépendamment l'un de l'autre.

Exemples

Exemple de code simple:

int ai = 50
int bi = 5

to ai >= 100 for &
   ai = ai + bi
   int ai
/to 

Exemple de code en une ligne:

int ci = 100

int addit()
   ci + bi
return ci

to ci >= 1000 for 0.9 do print addit()

Si l'on place les deux exemples dans un même programme, il s'exécuteront en même temps et leurs résultats intermédiaire seront affiché en alternance.

Si votre code fonctionne localement avec Node.js, il est aussi possible d'utiliser les bibliothèques process et child_process qui fournissent des possibilités similaires.

Voici le code JavaScript de la biblio scriptol.js qui permet l'orientation but:

exports.goal = function(condi, dur, actio) { 
var iter = setInterval(function() {
if(condi()) {
clearInterval(iter);
clearTimeout(limiter);
return;
}
actio();
}, 0);
if(dur == "&") dur = 2147483647;
var limiter=setTimeout(function() { clearInterval(iter); }, dur);
}

Cette fonction est appelée avec deux fonctions comme arguments, plus la durée. Regardez le code généré par le compilateur pour plus d'information.

Mode synchrone

Pour un fonctionnement synchrone, autrement dit pour que l'accomplissement des buts s'effectue l'un après l'autre, la syntaxe est la suivante:

to ...condition... while ...durée...
  ...processus...
/to

Sur une seule ligne:

to ...condition... while ...durée... do ...action... 

Le mot réservé while a remplacé le mot for.

Voici le code JavaScript pour le mode synchrone:

exports.goalSync=function(condi, dur, actio) { 
var stopFlag = false;
if(dur == "&") dur = 2147483647;
var limiter=setTimeout(function() { stopFlag = true; }, dur);
while(stopFlag == false) {
if(condi()) {
clearTimeout(limiter); stopFlag=true;
return;
}
actio();
}
}

L'utilisation est plus générale que le mode asynchrone, cette structure de contrôle peut s'utiliser dans tout traitement.

Vous trouverez des exemples de programmes SVG orientés but sur Scriptol.fr.