Calulatrice RPN
François26-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çois26-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
)
Bertrand26-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çois26-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.


Powered by RebelBB and REBOL 2.7.8.4.2