$longif : simplifie/clarifie les if longs et encombrants

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é

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.