diff --git a/extra/rpn/rpn-tests.factor b/extra/rpn/rpn-tests.factor new file mode 100644 index 0000000000..c24d5cb244 --- /dev/null +++ b/extra/rpn/rpn-tests.factor @@ -0,0 +1,4 @@ +IN: rpn.tests +USING: rpn lists tools.test ; + +[ { 2 } ] [ "4 2 -" rpn-parse rpn-eval list>array ] unit-test \ No newline at end of file diff --git a/extra/rpn/rpn.factor b/extra/rpn/rpn.factor index 7175746862..ba697df8d1 100644 --- a/extra/rpn/rpn.factor +++ b/extra/rpn/rpn.factor @@ -10,7 +10,7 @@ TUPLE: push-insn value ; GENERIC: eval-insn ( stack insn -- 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: sub-insn eval-insn drop [ - ] binary-op ; @@ -35,11 +35,11 @@ M: push-insn eval-insn value>> swons ; : print-stack ( list -- ) [ number>string print ] leach ; -: rpn-eval ( tokens -- ) - nil [ eval-insn ] foldl print-stack ; +: rpn-eval ( tokens -- stack ) + nil [ eval-insn ] foldl ; : rpn ( -- ) "RPN> " write flush - readln [ rpn-parse rpn-eval rpn ] when* ; + readln [ rpn-parse rpn-eval print-stack rpn ] when* ; MAIN: rpn