X-Git-Url: https://gitweb.factorcode.org/gitweb.cgi?p=factor.git;a=blobdiff_plain;f=extra%2Frpn%2Frpn.factor;fp=extra%2Frpn%2Frpn.factor;h=7175746862fd8eccade8046478dedf4a20073172;hp=0000000000000000000000000000000000000000;hb=4fac281b1aa26ad9ca2300d3b8eab7489ab91332;hpb=bf57d78b092d150d28bc5294bc38e0f88a5e4300 diff --git a/extra/rpn/rpn.factor b/extra/rpn/rpn.factor new file mode 100644 index 0000000000..7175746862 --- /dev/null +++ b/extra/rpn/rpn.factor @@ -0,0 +1,45 @@ +! Copyright (C) 2009 Slava Pestov +! See http://factorcode.org/license.txt for BSD license. +USING: accessors combinators io kernel lists math math.parser +sequences splitting ; +IN: rpn + +SINGLETONS: add-insn sub-insn mul-insn div-insn ; +TUPLE: push-insn value ; + +GENERIC: eval-insn ( stack insn -- stack ) + +: binary-op ( stack quot: ( x y -- z ) -- stack ) + [ uncons uncons ] dip dip cons ; inline + +M: add-insn eval-insn drop [ + ] binary-op ; +M: sub-insn eval-insn drop [ - ] binary-op ; +M: mul-insn eval-insn drop [ * ] binary-op ; +M: div-insn eval-insn drop [ / ] binary-op ; +M: push-insn eval-insn value>> swons ; + +: rpn-tokenize ( string -- string' ) + " " split harvest sequence>list ; + +: rpn-parse ( string -- tokens ) + rpn-tokenize [ + { + { "+" [ add-insn ] } + { "-" [ sub-insn ] } + { "*" [ mul-insn ] } + { "/" [ div-insn ] } + [ string>number push-insn boa ] + } case + ] lmap ; + +: print-stack ( list -- ) + [ number>string print ] leach ; + +: rpn-eval ( tokens -- ) + nil [ eval-insn ] foldl print-stack ; + +: rpn ( -- ) + "RPN> " write flush + readln [ rpn-parse rpn-eval rpn ] when* ; + +MAIN: rpn