1 ! Copyright (C) 2009 Slava Pestov
2 ! See http://factorcode.org/license.txt for BSD license.
3 USING: accessors combinators io kernel lists math math.parser
7 SINGLETONS: add-insn sub-insn mul-insn div-insn ;
8 TUPLE: push-insn value ;
10 GENERIC: eval-insn ( stack insn -- stack )
12 : binary-op ( stack quot: ( x y -- z ) -- stack )
13 [ uncons uncons ] dip dip cons ; inline
15 M: add-insn eval-insn drop [ + ] binary-op ;
16 M: sub-insn eval-insn drop [ - ] binary-op ;
17 M: mul-insn eval-insn drop [ * ] binary-op ;
18 M: div-insn eval-insn drop [ / ] binary-op ;
19 M: push-insn eval-insn value>> swons ;
21 : rpn-tokenize ( string -- string' )
22 " " split harvest sequence>list ;
24 : rpn-parse ( string -- tokens )
31 [ string>number push-insn boa ]
35 : print-stack ( list -- )
36 [ number>string print ] leach ;
38 : rpn-eval ( tokens -- )
39 nil [ eval-insn ] foldl print-stack ;
43 readln [ rpn-parse rpn-eval rpn ] when* ;