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
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.
Ç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.
Blague à part, j’ai quand même une petite remarque pour l’exemple que tu as donné en I7. Il vaut mieux écrire
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]Qu’est ce qui est concernée par cette action, la barre de fer ou la barre de chocolat ?
fer[/code]
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.
[size=70](HS : j’ai vu le tweet qui m’était adressé. C’est l’occasion pour moi de tweeter pour la première fois !)[/size]
Oui C’est aussi pour ça que je participe pas à la comp !
En I6 il y a la propriété « name », ça donnerait ça :
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
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.
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
! 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é
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' '.)',[/code]
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]! 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
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