From 9dd51d58de73d23efdb58f35872790ee7a9c298a Mon Sep 17 00:00:00 2001 From: Slava Pestov Date: Wed, 23 Sep 2009 17:33:03 -0500 Subject: [PATCH] rpn: fix operator order issue (reported by Jason Merrill) --- extra/rpn/rpn-tests.factor | 4 ++++ extra/rpn/rpn.factor | 8 ++++---- 2 files changed, 8 insertions(+), 4 deletions(-) create mode 100644 extra/rpn/rpn-tests.factor 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 -- 2.34.1