# rpn.pl^ # RPN CALC of Perl # by guel # 09/22/95 # 05/06/96 # 07/15/97 print "RPN CALC of Perl, ready. \t created by guel\n"; while (<>) { chop; foreach (split) { if (&isNum($_)) { &Push($_) } elsif ($_ eq '+') { $lastX = &Pop(); &Push(&Pop() + $lastX) } elsif ($_ eq '-') { $lastX = &Pop(); &Push(&Pop() - $lastX) } elsif ($_ eq '*') { $lastX = &Pop(); &Push(&Pop() * $lastX) } elsif ($_ eq '/') { $lastX = &Pop(); &Push(&Pop() / $lastX) } elsif (/^(\+\-|[lL])$/) { $lastX = &Pop(); &Push( - $lastX) } elsif (/^(1\/x|[xX])$/) { $lastX = &Pop(); &Push( 1 / $lastX) } elsif (/^(sqrt|[zZ])$/) { $lastX = &Pop(); &Push(sqrt($lastX)) } elsif (/^(last|[bB])$/) { &Push($lastX) } elsif (/^(down|[vV])$/) { &Pop() } # elsif (/^(xy|[cC])$/) { a = &Pop(); b = &Pop(); &Push(a); &Push(b) } # x<=>y } printf "%g\n", $stack[$#stack]; print join(" ",@stack); printf "\t (LastX=%g) (stack_depth=%d)\n", $lastX, $#stack; } sub Push { push(stack, $_[0]); } sub Pop { if ($#stack > -1) { return pop(stack); } else { printf "error: poped empty stack\n"; } } sub isNum { /^[+\-]?(\d+|\d*[.]\d+)(|[eE][+\-]\d+)$/ }