[Inform 7] Une histoire de variables temporaires

Salut à tous !

Toujours plongé dans ma quête de traqueur de points nébuleux, j’aborde aujourd’hui un point de détails, le nom des variables temporaires et les éventuels conflits qui peuvent, ou non, en découler.
Là est justement la question : peut-il y avoir des conflits ?

J’ai pour habitude de chercher à donner uniquement des noms différents à toutes mes variables temporaires. J’ai un peu peur qu’une similitude de noms, au moment malheureux où plusieurs règles sont en cours de déroulement, puisse provoquer une confusion de valeur, donc un bug bien vicieux à détecter, ce genre de collision se déroulant en général à cause d’une combinaison involontaire et donc ignorée.
Imaginez par exemple la variable N souvent utilisées dans les boucles qui s’emmêle parce qu’il y a une boucle dans une boucle et que toutes deux utilisent N. Moi, du coup, j’ai des N1, N2, N3… N5584, enfin pas si loin, j’exagère, mais l’idée est là.

Ai-je raison de procéder ainsi ?

Je viens de trouver cet extrait de code dans l’extension des liens hypertextes de Vorple :

To place a/-- link to a/the/-- command (cmd - text) called (classes - text) reading (txt - text), without showing the command:
  let silent be false;
  if without showing the command:
    now silent is true;
  let id be unique identifier;
  place "a" element called "vorple-link vorple-commandlink link-[id] [classes]" reading txt;
  execute JavaScript command "$('a.link-[id]').attr('href', '#').attr('data-command', '[escaped cmd]').attr('data-silent', '[silent]')".

To place a/-- link to a/the/-- command (cmd - text) called (classes - text), without showing the command:
  if without showing the command:
    place a link to the command cmd called classes reading cmd, without showing the command;
  otherwise:
    place a link to the command cmd called classes reading cmd.

Cette structure, très pratique pour rendre flexible les définitions, sans pour autant tout recopier, provoque-t-elle une confusion qui, bien sûr dans ce cadre, n’a aucune importance ?

Je cherche juste à piger le principe sous-jacent, comment Inform7 réagit-il quand il croise un nom de variable temporaire encore employé, mais désormais utilisé dans un cadre différent de celui où il a été initialement été déclaré.

Voilà, voilà !

Je ne me suis jamais vraiment posé la question, mais je pense qu’en général il n’y a pas trop besoin de se casser la tête.

Dans le cas où le nom est déjà utilisé (par exemple par une variable globale), je pense que ça empêchera, dans la règle ou la phrase en cours, d’accéder à la globale, puisque le nom fera à partir de ce moment référence à la locale.

Je pense aussi qu’il doit être possible qu’Inform détecte certains cas et renvoie une erreur si un nom est déjà utilisé.

Tu as raison d’utiliser des noms différents pour des boucles imbriqués, mais il n’y a pas à s’inquiéter autrement. Une variable locale n’est accessible que depuis la règle ou phrase en cours, donc la seule chose importante est qu’il n’y a pas de conflit au sein d’une même règle ou phrase. Ce n’est pas grave si un nom est déjà utilisé quelque part d’autre. Par exemple, il est possible de faire de la récursion :

To decide what number is (N - a number) factorielle: if N < 0: decide on 0; else if N is 0: decide on 1; else: let N2 be N - 1; decide on N * N2 factorielle.
Il n’y aura pas de conflit entre les différents N, chacun ne verra que sa phrase.

Sinon, je ne suis pas sûr de comprendre ce que tu veux montrer avec ce morceau de code Vorple, mais quoi que ce soit, il n’y aura pas de confusion.

Ok, merci ^^

Si les variables locales sont bien accessibles uniquement dans le cadre de leur définition, en effet, il n’y a pas trop à se prendre la tête.

Sinon, pour être sûr d’éviter les conflits, j’utilise en général des lettres (« E » pour un endroit, « P » pour une personne, etc.) ou des abréviations courtes (« txt » pour un texte), avec éventuellement un nombre. Certes, ça fait moins langage naturel, mais comme ça n’entrera pas en conflit avec d’éventuels objets ou variables ayant le même nom. Et ça reste suffisamment compréhensible.