rpn: fix operator order issue (reported by Jason Merrill)
parent
a4524874f4
commit
9dd51d58de
|
@ -0,0 +1,4 @@
|
||||||
|
IN: rpn.tests
|
||||||
|
USING: rpn lists tools.test ;
|
||||||
|
|
||||||
|
[ { 2 } ] [ "4 2 -" rpn-parse rpn-eval list>array ] unit-test
|
|
@ -10,7 +10,7 @@ TUPLE: push-insn value ;
|
||||||
GENERIC: eval-insn ( stack insn -- stack )
|
GENERIC: eval-insn ( stack insn -- stack )
|
||||||
|
|
||||||
: binary-op ( stack quot: ( x y -- z ) -- stack )
|
: binary-op ( stack quot: ( x y -- z ) -- stack )
|
||||||
[ uncons uncons ] dip dip cons ; inline
|
[ uncons uncons [ swap ] dip ] dip dip cons ; inline
|
||||||
|
|
||||||
M: add-insn eval-insn drop [ + ] binary-op ;
|
M: add-insn eval-insn drop [ + ] binary-op ;
|
||||||
M: sub-insn eval-insn drop [ - ] binary-op ;
|
M: sub-insn eval-insn drop [ - ] binary-op ;
|
||||||
|
@ -35,11 +35,11 @@ M: push-insn eval-insn value>> swons ;
|
||||||
: print-stack ( list -- )
|
: print-stack ( list -- )
|
||||||
[ number>string print ] leach ;
|
[ number>string print ] leach ;
|
||||||
|
|
||||||
: rpn-eval ( tokens -- )
|
: rpn-eval ( tokens -- stack )
|
||||||
nil [ eval-insn ] foldl print-stack ;
|
nil [ eval-insn ] foldl ;
|
||||||
|
|
||||||
: rpn ( -- )
|
: rpn ( -- )
|
||||||
"RPN> " write flush
|
"RPN> " write flush
|
||||||
readln [ rpn-parse rpn-eval rpn ] when* ;
|
readln [ rpn-parse rpn-eval print-stack rpn ] when* ;
|
||||||
|
|
||||||
MAIN: rpn
|
MAIN: rpn
|
||||||
|
|
Loading…
Reference in New Issue