+my %action = (
+# 'digit' => [-2, sub {
+# if ($val[1] *= 10) {
+# $val[0] += $_/$val[1];
+# } # fraction
+# else {
+# $val[0] = $val[0]*10+$_;
+# } # integer
+# }],
+ 'digit'=> [-2, sub { $val[0] = ($val[1] *= 10) ? $val[0]+$_/$val[1] : $val[0]*10+$_ }],
+ '.' => [-2, sub { $val[1] = 1 }], # decimal point
+ 'eex' => [-2, sub {}], # exponent
+ 'chs' => [1, sub {$val[0] = -$val[0]}], # negative
+
+ '<-' => [-1, sub {
+ $val[0] = ($val[1] = int $val[1]/10)
+ ? int($val[0]*$val[1])/$val[1] : int $val[0]/10
+ }], # backspace
+ 'clx' => [0, sub {@stack = (); @val = (0, 0); $nopush = 1}], # clear all
+
+ chr 13 => [0, sub {
+ unshift @stack, $val[0];
+ $nopush = 1;
+ }], # duplication
+
+ 'swap' => [1, sub {($val[0], $stack[0]) = ($stack[0], $val[0])}], # swap x<->y
+
+ '=' => [1, sub {$var{a} = $val[0]}], # copy
+ '>' => [1, sub {$var{a} = $val[0]; $val[0] = shift @stack}], # assign
+
+ '+' => [2, sub {$val[0] += shift @stack}], # addition
+ '-' => [2, sub {$val[0] = shift(@stack) - $val[0]}], # substraction
+ '*' => [2, sub {$val[0] *= shift @stack}], # multiplication
+ '/' => [2, sub {$val[0] = shift(@stack) / $val[0]}], # division
+ 'mod' => [2, sub {$val[0] = shift(@stack) % $val[0]}], # modulo
+
+ 'sqrt' => [1, sub {$val[0] = sqrt $val[0]}], # square root
+ 'sq' => [1, sub {$val[0] *= $val[0]}], # squared
+ '^' => [2, sub {$val[0] = shift(@stack) ** $val[0]}], # exponentiation
+ 'xroot'=> [2, sub {$val[0] = shift(@stack) ** (1/$val[0])}], # x-root of y
+
+ 'log' => [1, sub {$val[0] = log($val[0]) / log(10)}], # logarithm
+ 'alog' => [1, sub {$val[0] = 10 ** $val[0]}], # 10^x
+ 'ln' => [1, sub {$val[0] = log $val[0]}], # natural logaritm
+ 'lnp1' => [1, sub {$val[0] = log($val[0]+1)}], # ln(x+1)
+ 'exp' => [1, sub {$val[0] = exp($val[0])}], # e^x
+ 'expm' => [1, sub {$val[0] = exp($val[0])-1}], # exp(x)-1
+
+ 'sin' => [1, sub {$val[0] = sin $val[0]}], # sine
+ 'asin' => [1, sub {$val[0] = atan2($val[0], sqrt(1 - $val[0]*$val[0]))}], # inverse sine
+ 'cos' => [1, sub {$val[0] = cos $val[0]}], # cosine
+ 'acos' => [1, sub {$val[0] = atan2(sqrt(1 - $val[0]*$val[0]), $val[0])}], # inverse cosine
+ 'tan' => [1, sub {$val[0] = sin($val[0]) / cos($val[0])}], # tangent
+# 'atan' => [1, sub {}], # arctangent
+
+ '%' => [2, sub {$val[0] /= shift(@stack)}], # percentage
+ '%ch' => [2, sub {$val[0] = 100*(shift(@stack)-$val[0])/$val[0]}], # percentage change
+ '%t' => [2, sub {$val[0] = 100*$val[0]/shift(@stack)}], # percentage total
+
+ 'and' => [2, sub {$val[0] = shift(@stack) & $val[0]}], # bitwise and
+ 'or' => [2, sub {$val[0] = shift(@stack) | $val[0]}], # bitwise or
+ 'xor' => [2, sub {$val[0] = shift(@stack) ^ $val[0]}], # bitwise xor
+ 'not' => [2, sub {$val[0] = ~$val[0]}], # bitwise not
+
+ 'abs' => [1, sub {$val[0] = abs $val[0]}], # absolute #todo
+ 'sign' => [1, sub {$val[0] = $val[0] <=> 0}], # sign
+ 'ip' => [1, sub {$val[0] = int $val[0]}], # integer part
+ 'fp' => [1, sub {$val[0] -= int $val[0]}], # fractional part
+
+ 'rnd' => [1, sub {local $_ = 10**shift @stack; $val[0] = int(($val[0]+.5)*$_)/$_}], # round
+ 'trnc' => [1, sub {local $_ = 10**shift @stack; $val[0] = int($val[0]*$_)/$_}], # truncate
+ 'floor'=> [1, sub {$val[0] = int $val[0]}], # floor
+ 'ceil' => [1, sub {$val[0] = int $val[0]+.9999}], # ceil
+
+ 'min' => [2, sub {
+ local $_ = shift @stack;
+ $val[0] = $_ if $_<$val[0];
+ }], # minimum
+ 'max' => [2, sub {
+ local $_ = shift @stack;
+ $val[0] = $_ if $_>$val[0];
+ }], # maximum
+
+ 'dec' => [0, sub {$set{base} = 10}], # decimal
+ 'bin' => [0, sub {$set{base} = 2}], # binary
+ 'oct' => [0, sub {$set{base} = 8}], # octal
+ 'hex' => [0, sub {$set{base} = 16}], # hexadecimal
+ 'base36' => [0, sub {$set{base} = 36}], # alphanumerical
+); # %action