RPN

 

David Cobac, le 15 juin 2004 : RPN est l'acronyme de Reverse Polish Notation (notation polonaise inverse). Un célèbre fabricant de calculatrices [1] en a fait sa spécificité.

En un mot, il s'agit de suffixer les opérations effectuées et non plus les infixer (opérations habituellement écrites) ou les postfixer (arguments de procédures Tcl par exemple). Pour une introducion au RPN, voir [2].


dc voilà un petit widget [3] créé avec ITk qui donne

avec ce genre de code :

 package require numlist

 numlist .t -background white -widthnum 0 -height 4 \
    -font "courier 10 bold" -fontentree "helvetica 14"\
    -comentree "lappendNumlist .t" -liste {a b c d 1 2 3 4 5}
 pack .t -expand 1 -fill both

 proc lappendNumlist {w} {
    set laliste [$w cget -liste]
    lappend laliste [$w avoir]
    $w configure -liste $laliste
    $w affiche
 }

Il reste pas mal à faire au niveau des options gérées. Ce widget possède une option -liste permettant de spécifier la liste à prendre en compte et deux méthodes avoir pour récupérer le contenu de l'entry (cf. get) et affiche permettant d'actualiser l'affichage de la liste.

et voilà une classe ITcl appelée Monrpn ou monrpn permettant une manipulation genre RPN [4]

Cette classe travaille avec deux listes pile et elip, elip se met à jour à chaque modification de pile (c'est simplement la même liste dans l'autre sens). Pour l'affichage dans le widget numlist, il convient de travailler avec elip.

Les commandes disponibles pour l'instant (il en manque énormément) avec monrpn sont :

Ensemble, ils forment une petite calculatrice RPN à améliorer :

 package require monrpn
 package require numlist

 monrpn pile
 pack [numlist .t -widthnum 0 -comentree "ajoutPile .t pile" -height 4]

 proc ajoutPile {w nomPile} {
     # on rcupre la commande
     set com [$w avoir]
     if {$com==""} {
 	# si rien
     } elseif {[string is integer $com] || [string is double $com]} {
 	# si la commande est un nombre, on le met dans la pile
 	$nomPile Return $com
     } elseif {$com=="exit"} {
 	# on sort si exit
 	exit
     } else {
 	# sinon on value la commande
 	eval $nomPile $com
     }
     # on a une nouvelle pile qu'on insére dans le widget
     $w configure -liste [$nomPile cget -elip]
     $w affiche
 }

Sarnold J'ai utilisé une technique similaire pour l'exemple du package [math::bigfloat] de TclLib. Il s'agit simplement d'une interface graphique pour manipuler des entiers et des flottants à la sauce RPN.