Bonjour à tous,
je fais pour l'exercice un petit interpréteur RPN (Reverse Polish Notation). Mon premier brouillon fonctionne, mais je le trouve un peu … brouillon .
Ma pile est une float list reference ; et mes opérateurs des records contenant la commande utilisateur (string), le nombre d'opérandes (int) et l'opérateur (float list -> float list).
Je lis dans ma console une ligne. Si elle est interprétable en float, je l'empile sur ma pile globale ; et sinon je cherche dans la liste des opérateurs celui qui convient et l'applique (j'extrais le bon nombre d'éléments de la pile, les encapsule dans une float list, les passe à l'opérateur et empile le(s) résultat(s)).
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 let generic_operator op = let rec pop_operands acc = function | 0 -> acc | k -> pop_operands (pop() :: acc) (pred k) in List.iter push ( op.f (pop_operands [] op.dim) )
Ce n'est pas très élégant, n'est-ce pas ? De plus, si je veux ajouter des fonctionnalités ésotériques (variables, GUI, etc.) je dois bidouiller de manière pas vraiment orthodoxe.
Je viens donc à la pèche aux conseils. Quelles structures de données me conseillez-vous ?
Merci beaucoup.
Partager