$longif : simplifie/clarifie les if longs et encombrants

Soyez le premier à donner votre avis sur cette source.

Snippet vu 2 877 fois - Téléchargée 24 fois

Contenu du snippet

C'est une petite fonction qui facilite l'écriture de if longs. Par exemple vous avez ça :

if ((HeXoR isop #microsoft) && (HeXoR isop #agen) && (HeXoR isop #blabla) && (HeXoR isop #chut)) { ... }

C'est pas très lisible et pas très pratique... je transforme ce bout de code avec ma fonction :
if $longif(HeXoR, isop, #microsoft, #agen, #blabla, #chut, &&) { ... }
Le second argument est un des opérateurs de mIRC (==, !=, isin, etc.) et le dernier argument peut être soit && soit || (ET et OU). Cet argument joue un rôle sur tous les arguments précédents.

Maintenant, si nous avons :
if ((HeXoR isop #microsoft) && (HeXoR isop #agen)) || ((HeXoR isop #blabla) && (HeXoR isop #chut))
Là, le if est séparé en 2 parties séparées par ||, c'est à dire que le code à droite et à gauche du || est entouré de parenthèse. Pour faire ça avec $longif, il faut faire apparaitre un [||], un || entouré de crochets (c'est pour le distinguer des || normaux) :
if $longif(HeXoR, isop, #microsoft, #agen, &&, [||], #blabla, #chut, &&)
le premier && sert pour (HeXoR isop #microsoft) && (HeXoR isop #agen), et le second && pour (HeXoR isop #blabla) && (HeXoR isop #chut).
Remarque : il y a aussi [&&], qui joue le même rôle que [||] sauf que c'est un && au lieu d'un ||.

Maintenant si nous avons :
if (H isin HeXoR || e isin HeXoR || X isin HeXoR || o isin HeXoR || R isin HeXoR)
Là, une grosse erreur de votre part serait de faire :
if $longif(HeXoR, isin, H, e, X, o, R, ||)
Eh oui, car là la fonction va comprendre if (HeXoR isin H || HeXoR isin e || [etc.]), et ce n'est pas ce que je veux, moi je veux qu'il fasse if (H isin HeXoR || [etc.]), et bien pour cela il suffit d'ajouter .inv :
if $longif(HeXoR, isin, H, e, X, o, R, ||).inv
Et là ça sera bon.

Voilà, ça donne le même résultat sauf que c'est plus lisible et plus court. Je pense que ça peut être pratique pour les "longs" if...

Source / Exemple :


; $longif par HeXoR - hexor@wanadoo.fr | hexor47@hotmail.com
longif {
  var %c = $chr(36),%d = $chr(44),%e = $str($chr(38),2),%f = $str($chr(124),2),%j = $chr(91),%k = $chr(93),%a = %c $+ iif(,%b = $numtok($1-,32)
  while (%b > 3) {
    dec %b
    var %g = $gettok($1-,%b,32)
    if (%g = $+(%j,%e,%k) || %g = $+(%j,%f,%k)) { var %a = $left(%a,4) $+ ( $+ $mid(%a,5,$calc($len(%a) -7)) $+ ) $mid(%g,2,2) ( | tokenize 32 $gettok($1-,1- [ $+ [ $calc(%b -1) ] ],32) | var %z = %z $+ ) }
    var %h = $gettok($1-,$calc(%b -1),32)
    if (%h = %e || %h = %f) { tokenize 32 $gettok($1-, 1- [ $+ [ $calc(%b -1) ] ],32) | dec %b 2 | var %g = $gettok($1-,%b,32) }
    var %a = %a $iif($prop = inv,%g $2 $1,$1 $2 %g) $gettok($1-,$numtok($1-,32),32)
  }
  var %i = $+($left(%a,$calc($len(%a) -3)),%z,%d,%c,true,%d,%c,false) $+ )
  return $(%i,2)
}

longif { ; ancien avant mise à jour
; Synthaxe : $longif(v1, operator, op_combin, v2, v3, v4[, ...])
  var %c = $chr(36), %d = $chr(44), %a = %c $+ iif(, %b = $calc($numtok($1-, 32) +1) 
  while %b > 4 {
    dec %b
    var %a = %a $1 $2 $gettok($1-, %b, 32) $3
  }
  alias longiftmp return $+($left(%a, $calc($len(%a) - 3)),%d,%c,true,%d,%c,false) $+ )
  var %e = $longiftmp
  alias longiftmp
  return %e
}

Conclusion :


J'aimerai bien avoir des commentaires, donnez moi votre avis, dites moi s'il y a des erreurs/bugs, etc. ! Merci :)
- 1ère modification : optimisation de la déclaration des variables (merci à SornDrixer)
- 2ème modification : une grosse partie code a été refait, basé sur l'idée de Kerrigan (voire son commentaire) mais j'ai rajouté d'autres trucs (comme .inv). J'espère que vous aurez compris la synthaxe de la nouvelle fonction, je sais que j'explique mal... Vous pouvez toujours me poser des questions ou continuer à utiliser l'ancienne version si vous ne comprennez pas...
- 3ème modification : source améliorée de telle sorte que le code gagne en rapidité

A voir également

Ajouter un commentaire

Commentaires

Messages postés
165
Date d'inscription
mercredi 29 janvier 2003
Statut
Membre
Dernière intervention
15 avril 2010

Le code à été modifié : l'alias temporaire remplacé et donc il gagne en rapidité :) (merci à McFly)
Messages postés
165
Date d'inscription
mercredi 29 janvier 2003
Statut
Membre
Dernière intervention
15 avril 2010

Oué c'est possible que ce soit plus long mais bon on est pas à quelques millisecondes près.. (sauf évidemment si tu met $longif dans une boucle qui se répète plusieurs fois là c'est sûr tu dois voir la différence)
Messages postés
708
Date d'inscription
lundi 15 juillet 2002
Statut
Membre
Dernière intervention
17 mars 2005

Je ne pense pas que je vais l'utiliser parce que j'ai réflechis a un truc .
Quand je tape mon if super long mirc le regarde directement.
C'est clair que ce n'est pas beau mais bon en terme de ressource ça ne demande rien d'autre que l'interpréteur mirc. Par contre si on utilise ton fonction la c'est un code mirc qui va évaluer et qui va etre interprété donc on lance plus de processus. Ca ne veut pas dire que ta source est inutile , loin de la je l'ai noté 10/10, je pense que pour un langage (nouveau) ce type de syntaxe pourrait etre intéréssante.

Ne t'arrete pas en si bon chemin avec ce genre d'idée on peut arriver faire des trucs vraiment méchant :)))
Messages postés
165
Date d'inscription
mercredi 29 janvier 2003
Statut
Membre
Dernière intervention
15 avril 2010

merci kerrigan et c'est grâce à ton idée aussi que j'ai fait ça ;) j'espère que vous allez pas tous vous décourager à cause de la complexité de l'utilisation :)
Messages postés
708
Date d'inscription
lundi 15 juillet 2002
Statut
Membre
Dernière intervention
17 mars 2005

Bravo hexor bon boulot excélent
Afficher les 19 commentaires

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.