Boucle for

Soyez le premier à donner votre avis sur cette source.

Snippet vu 4 860 fois - Téléchargée 23 fois

Contenu du snippet

Bonjour tout le monde :)

Je vais directement aux choses sérieuses:
Cette fonction vous permettra de faire une suite de commandes plusieurs fois
en utilisant la syntaxe de base (ou presque lol (oui , je l'ai un peu adapté :s)) de la fameuse boucle FOR

Syntaxe: /for [NomVariable][=][Initialisation] [NomVariable][<|>|<=|>=][Fin] <[+|-][Pas]|[NomVariable][++|--]|[NomVariable]=[NomVariable][+|-][Pas]> [CommandBlocName] [OtherParameters]

Exemples d'utilisation:
-------------------------
for test=1 test<=10 +1 commbloc %autreparamètre1
for test test<5 +2 commbloc %autreparamètre1 %autreparamètre2
for test=10 test>1 -1 commbloc
for test test<=4 test++ commbloc
for test=10 test>=1 -2 commbloc %autreparamètre1
for test=2 test<=10 test=test+3 commbloc %autreparamètre
for test=3 test<7 +2 commbloc

Explication des exemples:
-----------------------------
> Pour chaque cas, il faut comme vous le voyez fournir un nom de variable et son initialisation à savoir test=1 ou test=10 ou encore test=3
Ce nom de variable devra absolument être sous la forme :alnum:+ (ne peut contenir que des lettres ou/et des chiffres)
La valeure de l'initialisation peut être nulle , auquel cas , la boucle la considérera comme commençant à 0

> En deuzième paramètre, vous fournirez la borne d'arrêt de la boucle, à savoir test<=10 ou test>1

> En troisième paramètre, vous mettrez le " pas " que devra respecter la boucle for.
>> pour faire une boucle incrémentative:
>>> +Pas
>>> ou NomVariable++
>>> ou NomVariable=NomVariable+Pas
>> pour une boucle décrémentative:
>>> -Pas
>>> ou NomVariable--
>>> ou NomVariable=NomVariable-Pas

> Finalement, précisez absolument le nom de l'alias contenant les commandes a boucler
Les [OtherParameters] sont quant à eux les paramètres que vous incluerez si par exemple vous utilisez cette boucle au beau milieu d'un autre alias, donc vous comprendrez qu'il faille lui envoyer les paramètres(variables) déjà en utilisation lors de son appel pour permettre au bon fonctionnement de la suite des instructions.
> En passant les [OtherParameters] , dans les bloc de commandes , on les retrouvera certainement :). tout dépend de ce que vous voulez faire ^^

Raison de ce modèle:
------------------------
Je n'ai pas trouvé (ou pas encore :p) d'autres moyens d'intégrer un bloc de commande dans une boucle for directement par l'appel de l'alias for lui-même
Donc je passe par un alias intermédiaire contenant les commandes a faire

ps:
---
J'ai inclus un alias d'exemple " commbloc " afin que vous puissiez voir le fonctionnement de la bête lol

Source / Exemple :


; Boucle For
; -----------

alias for  {
  if ($4) {
    if $regex($1,/^(:alnum:+=\d{1,})/i) { var %deb , %debreg = $regsub($1,/(:alnum:+=)/gi,,%deb) }
    elseif $regex($1,/^(:alnum:+)$/i) { var %deb = 0 }
    else { forsyn | goto end }
    if $regex($2,/((:alnum:)(<|>|<=|>=)(\d{1,2}))/) { var %fin = $regml(4) , %marche = $regml(3) }
    else { forsyn | goto end }
    if $regex($3,/^(([+-])(\d{1,}))$/) { var %mdpas = $regml(2) , %pas = $regml(3) }
    elseif $regex($3,/^((:alnum:+)((\+|-){2}))$/i) { var %mdpas = $left($regml(3),1) , %pas = 1 }
    elseif $regex($3,/^((:alnum:+)=(\2)([+-])(\d{1,}))$/i) { var %mdpas = $regml(4) , %pas = $regml(5) }
    else { forsyn | goto end }
    %commblc = $4
    if ($5-) { var %oparam = $5- }
    while (%deb %marche %fin) { %commblc %deb $iif(%oparam,%oparam) | $iif((%mdpas == +),inc,dec) %deb %pas }
  }
  else { forsyn }
  :end
}
alias -l forsyn {
  echo -st $chr(2) $+ Incorrect Syntax in " FOR-loop "
  echo -st $chr(160)
  echo -st /for $for< $+ [NomVariable][=][Initialisation] $+ $for> $for< $+ [NomVariable][<|>|<=|>=][Fin] $+ $for> $for< $+ [+|-][Pas] $+ $for| $+ [NomVariable][++|--] $+ $for| $+ [NomVariable]=[NomVariable][+|-][Pas] $+ $for> $for< $+ [CommandBlocName] $+ $for> $for< $+ [OtherParameters] $+ $for>
  echo -st $chr(160)
  echo -st $fordb(Para 1:) $for< $+ [NomVariable][=][Initialisation] $+ $for> $fordb(Para 2:) $for< $+ [NomVariable][<|>|<=|>=][Fin] $+ $for>
  echo -st $fordb(Para 3:) $for< $+ [+|-][Pas] $+ $for| $+ [NomVariable][++|--] $+ $for| $+ [NomVariable]=[NomVariable][+|-][Pas] $+ $for>
  echo -st $fordb(Para 4:) $for< $+ [CommandBlocName] $+ $for> $fordb(Para 5:) $for< $+ [OtherParameters] $+ $for>
}
alias -l for< { return $+($chr(3),03,<,$chr(3)) }
alias -l for> { return $+($chr(3),03,>,$chr(3)) }
alias -l for| { return $+($chr(3),04,|,$chr(3)) }
alias -l fordb { return $+($chr(2),$1-,$chr(2)) }

; Exemple de Bloc de commandes
; -------------------------------------

alias commbloc {
  ; Para. $1 = %deb ; Other Parameters = $2-
  echo -st -
  echo -st command: $1
  echo -st command: $1
  echo -st Other Parameters: $2-
  echo -st -
}

; FOR Loop (with comments)
; ------------------------ 
  
alias for {
  ; si tous les paramètres nécessaires existent ...
  if ($4) { 
    ; recherche de la valeure de l'initialisation ...
    ; en utilisant un $regsub, on récupère cette valeure !
    if $regex($1,/^(:alnum:+=\d{1,})/i) { 
      var %deb , %debreg = $regsub($1,/(:alnum:+=)/gi,,%deb)
    } 
    ; si aucune valeure n'est précisée, alors prendre 0 !
    elseif $regex($1,/^(:alnum:+)$/i) { 
      var %deb = 0
    } 
    ; sinon , aller acheter un kébab ptdr
    else { forsyn | goto end }
    ; recherche de la borne de la boucle ...
    ; à partir du $regex et donc des $regml(n), on récupère les valeurs qu'ils nous faut ^^
    if $regex($2,/((:alnum:)(<|>|<=|>=)(\d{1,2}))/) {
      var %fin = $regml(4) , %marche = $regml(3)
    } 
    ; sinon , aller au macdo LOL
    else { forsyn | goto end } 
    ; recherche du pas de la boucle ...
    ; j'utilise ici 3 modèles de regex différents ^^
    ; cas ou +|-Pas est rentré
    if $regex($3,/^(([+-])(\d{1,}))$/) { 
      var %mdpas = $regml(2) , %pas = $regml(3)
    } 
    ; cas ou NomVariable++|-- est rentré
    elseif $regex($3,/^((:alnum:+)((\+|-){2}))$/i) {
      var %mdpas = $left($regml(3),1) , %pas = 1
    } 
    ; cas ou NomVariable=NomVariable+Pas est rentré ^^
    ; ( attention: si vous mettez par exemple, test=machine+2 , ça ne marchera jamais . il faut mettre test=test+2 , si le nom de la variable est " test " bien sur )
    elseif $regex($3,/^((:alnum:+)=(\2)([+-])(\d{1,}))$/i) {
      var %mdpas = $regml(4) , %pas = $regml(5)
    } 
    ; sinon , manger une pomme !
    else { forsyn | goto end }
    ; récupération du nom de bloc de commandes et de ses paramètres ...
    %commblc = $4 
    if ($5-) { var %oparam = $5- } 
    ; enfin , faire une boucle avec toutes les valeurs précédemment traitées :O)
    while (%deb %marche %fin) { 
      ; appel du bloc de commande ^^ ...
      %commblc %deb $iif(%oparam,%oparam)
      ; ici , selon la valeu de %mdpas (+ ou -), faire un inc ou un dec :)
      $iif((%mdpas == +),inc,dec) %deb %pas 
    } 
  } 
  else { forsyn } 
  :end 
} 

/*
Quelques explications sur les Regex:
$regml(n) renvoit la nième partie du texte vérifiant le modèle
ainsi, on peut récupérer CE QUE L'ON VEUT (n'est-ce pas génial ? :p)
$regsub quant à lui à la prétention de faire une substitution de ce qu'on veut dans une chaîne de caractère par ce que l'on veut \o/

  • /
voila voila

Conclusion :


Bonne utilisation && enjoy ^^

A voir également

Ajouter un commentaire

Commentaires

cs_TropNul
Messages postés
340
Date d'inscription
dimanche 18 septembre 2005
Statut
Membre
Dernière intervention
22 octobre 2009
-
18 lignes et non 110 :p (recompte ;o))

sinon bah, j'ai fait cela pour m'amuser ^^, de montrer que cela est possible de déclarer toutes les variables d'une boucle n'importe ou , n'importe quand sur une seule ligne .

bref , il va sans dire que ce code ne vous sera jamais utile mais bon , j'adore les regex et je savais pas quoi faire donc voila :)

(ps: pour les commentaires> je préfère m'amuser en codant, jpense que ça me va mieux ^^ mais bon chacun son truc heinG)

:O)
RCA ArKanis
Messages postés
1287
Date d'inscription
mercredi 21 avril 2004
Statut
Membre
Dernière intervention
21 février 2009
-
je trouve beaucoup plus simple d'utiliser uniquement des while que de faire un code de 110 lignes pour une boucle FOR :(

j'aime pas les gotos, mais sinon ça parait plutôt bien codé
bon par contre les commentaires ... :)
cs_wims
Messages postés
2466
Date d'inscription
vendredi 23 juillet 2004
Statut
Membre
Dernière intervention
1 août 2010
1 -
http://www.scriptsdb.org/comments.php?id=1041

J'suis d'accord avec le premier commentaires du lien.
AgoRa_ScripT
Messages postés
140
Date d'inscription
jeudi 22 juillet 2004
Statut
Membre
Dernière intervention
20 octobre 2007
-
interressant (pour ma part), je vais peut être enfin adhérer aux regex, il serait temps.

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.