Calulatrice RPN | |
François | 26-Jul-2008/15:14:31+2:00 |
Bonjour, Je suis occupé à programmer une calculatrice RPN (sur le modèle de ma HP48) pour cela, je construis un parser, qui ressemble actuellement à ceci: any [ set arg number! (append stack arg) | ;**************************************** ; STACK COMMANDS ;**************************************** 'CLEAR ( ; Clears the entire stack stack: head stack clear stack ) | 'DROP ( ; Deletes level one of the stack remove back tail stack ) | 'SWAP ( ; Swaps levels and 1 & 2 stack: at tail stack -2 reverse stack ) | 'OVER ( ; Copies level 2 into level 1, pushing old level 1 to 2 ; TO-DO: erreur si taille pile < 2 append stack first at tail stack -2 ) | 'ROT ( ; Moves level 3 to level 1, pushing up the stack. ; TO-DO: erreur si taille pile < 3 append stack first at tail stack -3 remove at tail stack -4 ) | 'ROLL ( ; Moves a specified level to level 1 stack: head stack var: last stack ; TO-DO: erreur si taille pile < dernier élément + 1 ; if lesser? length? stack add var 1 [error] remove back tail stack append stack first at tail stack negate var remove at tail stack negate add var 1 ) | 'ROLLD ( ; Moves level 1 to a specified level stack: head stack var: last stack ; TO-DO: erreur si taille pile < var + 1 ; if lesser? length? stack add var 1 [error] remove back tail stack insert at tail stack negate var last stack remove back tail stack ) | 'PICK ( ; Copies a specified level to level 1 stack: head stack var: last stack ; TO-DO: erreur si taille pile < dernier élément + 1 ; if lesser? length? stack add var 1 [error] remove back tail stack append stack first at tail stack negate var ) | 'DEPTH ( ; Counts the number of active levels in the stack placing the number on level 1 append stack length? head stack ) | 'DUP ( ; Duplique le dernier élément au sommet de la pile stack: head stack append stack last stack ) | 'DUP2 ( ; Copies levels 1 & 2 append stack copy at tail stack -2 ) | 'DUPN ( ; Copies a specified number of levels again stack: tail stack var: first back stack remove back stack append stack copy at stack negate var ) | 'DROP2 ( ; deletes levels 1 & 2 remove at tail stack -2 ) | 'DRPN ( ; a specified number of levels are deleted stack: tail stack var: first back stack clear at stack negate add var 1 ) | ;**************************************** ; OPERATORS ;**************************************** '+ ( stack: at tail stack -2 var: add second stack first stack clear stack append stack var ) | '- ( stack: at tail stack -2 var: subtract second stack first stack clear stack append stack var ) | '* ( stack: at tail stack -2 var: multiply second stack first stack clear stack append stack var ) | '/ ( stack: at tail stack -2 var: divide second stack first stack clear stack append stack var ) | ;**************************************** ; TRIGONOMETRIC FUNCTIONS ;**************************************** 'SIN ( stack: head stack var: last stack remove back tail stack append stack sine var ) | 'COS ( stack: head stack var: last stack remove back tail stack append stack cosine var ) ] La seule règle qui foire, c'est celle de la division: j'obtiens le message suivant: ** Syntax Error: Invalid word-lit -- ' ** Near: (line 125) '/ ( Comment puis-je faire reconnaître le signe '/ au même titre que '*, '- et '+ D'avance merci François | |
François | 26-Jul-2008/16:21:25+2:00 |
O, j'ai trouvé la solution. Il suffit de définir une variable fwd-slash: to-lit-word et l'itiliser dans la règle de parsing à la place de '/ fwd-slash ( stack: at tail stack -2 arg: divide first stack second stack clear stack append/only stack arg ) | |
Bertrand | 26-Jul-2008/16:49:50+2:00 |
Tu voulais sans doute dire :fwd-slash: to-lit-word "/" Je cherchais justement une solution comme celle-là mais tu as été plus rapide que moi. | |
François | 26-Jul-2008/18:03:51+2:00 |
Effectivement... j'ai oublié le "/" Je retrouve avec un grand plaisir rebol après 2 ans d'absence :( Et même si Rebol 3 n'est pas encore là, force est de reconnaître que ce language offrent une productivité prodigieuse par rapport aux autres... | |
Login required to Post. |