Nouvelle extension I6 : PhraseNames

Espace libre pour faire connaître vos dernières réalisations ou les événements concernant la communauté (concours, jeux individuels, etc.)

Modérateurs: Stormi, Otto Grimwald

Nouvelle extension I6 : PhraseNames

Messagepar Mule hollandaise le Mer Nov 26, 2014 11:10 pm

Allez hop, une autre extension I6, cette fois pour éviter d'écrire des parse_names stupides ou compliqués à n'en plus finir ! Je vous présente votre nouvel ami : PhraseNames.

J'ai toujours été jaloux de "Understand 'barre de fer' as the barre" dans Inform 7 ; voilà une fonctionnalité équivalente en I6 :) Mais c'est même encore mieux ! Il y a aussi des tokens spéciaux pour rajouter différentes combinaisons de mots ; par exemple, vous pouvez écrire
Code: Tout sélectionner
    Object barredefer "barre de fer"
      with parse_name ComplicatedParsing,     ! obligatoire
           name 'barre' 'barreau',
           phrase_name '.name' '.opt(' 'de' '.or' 'en' 'fer' '.)';

pour avoir les combinaisons : "barre", "barreau", "barre de fer", "barre en fer", "barreau de fer" et "barreau en fer" !

Comme d'habitude, si vous avez des remarques ou des rapports de bugs, je suis preneur :) Je vais peut-être faire une version 2 avec des '.or' qui permettent de sélectionner plusieurs mots, et sûrement refactoriser le code pour pouvoir définir des propriétés phrase_name2, phrase_name3, etc. parce qu'une propriété est limitée à 32 mots.
Mule hollandaise
Grand Ancien
 
Messages: 1126
Inscription: Mar Aoû 29, 2006 10:57 pm

Re: Nouvelle extension I6 : PhraseNames

Messagepar Natrium le Jeu Nov 27, 2014 1:55 am

Ça travaille fort, dis donc !
Encore une fois, je n'ai absolument rien à dire sur le sujet puisque je ne comprends pas grand-chose à I6.
C'est pourquoi mon post ne sert à rien. :lol:

Blague à part, j'ai quand même une petite remarque pour l'exemple que tu as donné en I7. Il vaut mieux écrire
Code: Tout sélectionner
Understand "barre", "de" or "fer" as le lingot.
[plutôt que Understand "barre de fer" as le lingot.]

Comme ça, « >pr barre » ou « >pr fer » ou « >pr barre de fer » fonctionneront tous les trois. Et c'est mieux aussi pour les disambiguations:
Code: Tout sélectionner
Qu'est ce qui est concernée par cette action, la barre de fer ou la barre de chocolat ?
>fer

fonctionnera, alors que ça n'aurait pas fonctionné avec seulement la deuxième ligne de compréhension (il aurait alors fallu en rajouter une deuxième).

Aussi, comment on rajoute des synonymes sans cette extension, normalement ?
Désolé pour l'apparté, je laisse maintenant la place aux connaisseurs d'Inform 6.

(HS : j'ai vu le tweet qui m'était adressé. C'est l'occasion pour moi de tweeter pour la première fois !)
Avatar de l’utilisateur
Natrium
Grand Ancien
 
Messages: 1186
Inscription: Mar Oct 04, 2011 11:18 pm

Re: Nouvelle extension I6 : PhraseNames

Messagepar Mule hollandaise le Jeu Nov 27, 2014 2:26 am

Oui :) C'est aussi pour ça que je participe pas à la comp !

En I6 il y a la propriété "name", ça donnerait ça :
Code: Tout sélectionner
Object barredefer "barre de fer"
  with name 'barre' 'de' 'fer',
  Etc

C'est strictement équivalent à "understand 'barre', 'de' or 'fer' as the lingot".

Le problème de cette méthode, à part le fait que ">x de" sera interprété comme juste (et si il y a un dé dans les parages, c'est pas bon), c'est qu'il n'y a pas vraiment de moyen de distinguer ce qui est vraiment important dans le mot et ce qui est moins important, par exemple les noms des adjectifs. Du coup ça peut donner des "boucles infinies de désambiguation" du genre
>x orange
Que voulez-vous dire, l'orange ou la voiture orange?
>orange
Que voulez-vous dire, l'orange ou la voiture orange?
Etc

N'importe qui comprendrait, mais le parser voit un score de 1 pour les deux mots...
Y'a une extension I6 qui permet de définir certains mots comme des adjectifs, ie ils perdent toujours face à quelqu'un d'autre. Mon extension est une autre façon (plus générale je pense), de résoudre le problème - il suffit de dire que 'orange' sans 'voiture' n'a pas de sens, ie que 'orange' est optionnel, et c'est bon.
Mule hollandaise
Grand Ancien
 
Messages: 1126
Inscription: Mar Aoû 29, 2006 10:57 pm

Re: Nouvelle extension I6 : PhraseNames

Messagepar Mule hollandaise le Sam Nov 29, 2014 11:09 am

Loin de moi l'idée de vouloir faire le malin, mais je suis en train de mettre à jour Homeland Security, et je suis assez satisfait de ce que cette extension me permet de faire :)

Exemple 1 : le dépliant coloré sur la sécurité de l'aéroport d'Aruba :
Avant : parse_name horrible qui fait mal à la tête de 22 lignes
Code: Tout sélectionner
!   parse_name [n w acc;
!      n = 0; acc = 0; w = NextWord();
!      if (WordInProperty(w, self, name))
!      {
!        n++; w = NextWord();
!        if (w == 'colore') {n++; w =NextWord();}
!        if (w == 'sur') {acc++; w = NextWord(); if (w == 'la') {acc++; w = NextWord();}}
!        if (w == 'l^') {acc++; w = NextWord();}
!        else {   if (w == 'securite') { n = n + acc+1; acc=0; w = NextWord();}
!                 if (w == 'de')
!                 {acc++; w = NextWord(); if (w == 'l^') {acc++; w = NextWord(); }}
!                 if (w == 'd^') {acc++; w = NextWord();}
!        }
!        if (w == 'aeroport')
!        { n = n + acc+1; acc=0; w = NextWord();
!          if (w == 'd^' or 'de') { acc++; w = NextWord(); }
!          if (w == 'aruba') { n = n+acc+1; acc=0; w = NextWord();}
!        }
!      }
!      return n;
!      ],

Après : phrase_name pas très compliqué :)
Code: Tout sélectionner
   phrase_name '.name' '.opt' 'colore' '.opt(' 'sur' '.opt' 'la' 'securite' '.)' '.rest' 'de' '.or' 'a' 'l^' 'aeroport' '.opt(' 'd^' 'Aruba' '.)' './'
               '.name' '.opt' 'colore' '.opt(' 'sur' 'l^' 'aeroport' '.opt(' 'd^' 'Aruba' '.)',


Autre exemple : la porte automatique coulissante en plexiglas de l'aéroport : 32 lignes de parse_name dégueu avant, un phrase_name après
Code: Tout sélectionner
!   parse_name [ n w acc f;
!           n=0; acc=0;
!           w=NextWord();
!           if (w == 'porte')
!!           { n = n++; w = NextWord();
!             f=1;
!             while(f)
!             {
!               switch(w)
!               {
!                 'automatique': n++; w=NextWord();
!                 'coulissante': n++; w=NextWord();
!                 'en': w=NextWord();
!                       if (w == 'verre' or 'plexiglas') {n=n+2; w=NextWord();}
!                       else { if (w == 'face')   ! x porte en face de vous
!                              {
!                                n = n+2;
!                                if (NextWord() == 'de')
!                                { if (NextWord() == 'vous' or 'moi') {n = n+2; w=NextWord();} else {return n;}}
!                              }
!                       }
!                  default: f=0;
!               }
!             }
!             if (w == 'de') ! x porte coulissante en verre de l'aéroport
!             { if (NextWord()=='l^' && NextWord() == 'aeroport') {n = n+3;}
!             }
!            
!             return n;
!           }
!          
!   ],

vs
Code: Tout sélectionner
phrase_name '.name' '.opt' 'automatique' '.opt' 'coulissante' '.opt(' 'en' 'verre' '.or' 'plexiglas' '.)' '.rest' 'de' 'l^' 'aeroport' './'
               '.name' '.opt' 'automatique' '.opt' 'coulissante' '.rest' 'en' 'face' '.opt(' 'de' 'vous' '.or' 'moi' '.)',

Même si ce dernier exemple est imparfait, puisque 'porte coulissante automatique' n'est pas reconnu - et j'atteins les 32 tokens ici, donc il va falloir que je rajoute la possibilité d'utiliser une propriété phrase_name2 pour plus de flexibilité.

Mais bon, j'ai l'impression que cette extension peut simplifier grandement la vie :)
Mule hollandaise
Grand Ancien
 
Messages: 1126
Inscription: Mar Aoû 29, 2006 10:57 pm


Retourner vers Annonces

Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 1 invité

cron