Scénario : Je suis en train d'analyser un IL et je veux convertir une représentation basée sur une pile en un CFG par exemple.
Mon IL consiste en de multiples opérations comme PushInt(value), Pop etc. La question est maintenant de savoir quelle implémentation serait correcte en termes de Scala. J'aimerais utiliser des classes/objets de cas ou des extracteurs afin de pouvoir écrire du code alà
op match {
case PushInt(x) => doSomethingWith x
case Pop => ...
}
Maintenant le problème existe avec une séquence comme PushInt(1) :: PushInt(1) :: Pop :: Pop
puisque PushInt(1) est égal à PushInt(1) et que je ne peux pas ajouter plusieurs opérations (égales) dans une collection. Cependant, je sais que je jette une information, à savoir la position dans le flux, mais celle-ci est implicitement stockée sous forme d'index dans la séquence.
-
Une solution possible est de remplacer la méthode hashCode et d'enfreindre les règles de equal/hashCode. Je ne suis pas vraiment satisfait de cette solution.
-
Une autre option est d'avoir un compteur de "temps de création" qui est stocké dans la base abstraite de sorte que
case class PushInt(value: Int) extends AbstractOp(AbstractOp.nextIndex)
-
Utiliser des extracteurs, mais dans ce cas, il me manquera des fonctionnalités intéressantes comme l'implémentation de hashCode, equals, toString et, plus important encore, la vérification d'une correspondance exhaustive.
Ma question est donc maintenant de savoir comment modéliser ma structure en fonction de mes besoins. L'une des solutions possibles est-elle "correcte" en termes de Scala ?