if 0 {[Richard Suchenwirth] 2004-01-13 - In [RPN in Tcl] I've played a bit with emulating [Forth] in Tcl. Here is a much shorter take that defines a single ''rpn'' proc, which takes a body in Reverse Polish Notation, and the rest of the arguments as the initial stack. The words in the body are executed from left to right, either as Forth-like stack operations, or as a Tcl command which has to have one argument (popped from stack) and whose result is pushed on the stack.} proc rpn {body args} { foreach word $body { switch -- $word { drop {pop args} dup {push args [lindex $args end]} swap {push args [pop args] [pop args]} + - "-" - * - / - % { #-- binary arithmetic operators: set 1 [pop args] push args [expr [pop args] $word $1] } default {push args [$word [pop args]]} } } set args } # Simple stack routines: interp alias {} push {} lappend proc pop stackName { upvar 1 $stackName stack K [lindex $stack end] [set stack [lrange $stack 0 end-1]] } # ..and the indispensable [K] combinator: proc K {a b} {set a} if 0 {This test will display the source file on stdout. Notice how no variables are needed at all (if you don't count the stack as the Big Variable :} puts [rpn {open dup read swap close drop} rpn.tcl] # Testing the newly added arithmetics, which cost the 4 LOC above: puts [rpn {+ *} 3 2 1] ;# (2+1)*3 -> 9 ''Wow, Richard, what a delightful wizzlet! -[jcw]'' ---- [Arts and crafts of Tcl-Tk programming]