Reverse Polish Notation Calculator
Versions
- 1.0.0
- Initial version.
Introduction
RPN is a command line reverse Polish notation calculator. As such, it pushes integer and fractional numbers onto a stack, and pops them off for operations:
$ rpn
dec> 6 7
dec> show
6
7
dec> mul
42
RPN accepts input from files if supplied on the command line, and automatically detects if it's part of a POSIX shell command pipeline:
$ cat input.txt
6 7
mul
$ rpn input.txt
42
$ rpn <input.txt
42
$ rpn >output.txt
6 7
mul
$ cat output.txt
42
RPN optionally accepts input directly from the command line:
$ rpn --command 6 7 mul
42
Some operations are binary like add and mul, some are unary like neg and inv, some are nullary like now, some operate on the entire stack like sum and prod. Inline help provides a hint on expected inputs and outputs:
dec> help
Arithmetic operations:
N N add,+ N Add two values
N N sub,- N Subtract two values
N N mul,* N Multiply two values
N N div,/ N Divide two values
N N mod,% N Modulo two values
N neg N Find the negative
N inv N Find the inverse
N N pow N Raise to the power
N sqrt N Find the square root
* sum N Sum all values
* prod N Multiply all values
Bitwise operations:
N N and N Bitwise AND two values
N N or N Bitwise OR two values
N N xor N Bitwise XOR two values
N N shl N Shift left (multiply by power of 2)
N N shr N Shift right (divide by power of 2)
Time operations:
now N Get the current time
N plain N Convert to a plain value
N delta N Convert to a delta value
N time N Convert to a time value
Formatting commands:
dec Expect and format values as decimal
hex Expect and format values as hexadecimal
sep Include a separator
nosep Include no separator
N dp Use fixed decimal places
nodp Use free decimal places
Stack commands:
* c(lear) Remove all values from the stack
N p(op) Remove a value from the stack
N d(up) N N Duplicate a value on the stack
N N s(wap) N N Swap two values on the stack
N cut Cut a value to the internal clipboard
N copy N Copy a value to the internal clipboard
paste N Paste a value from the internal clipboard
History commands:
u(ndo) Undo the last operation
r(edo) Redo the next operation
h(ist) Show all undo/redo history
General commands:
show Show all values on the stack
help Show this help text
Feature requests are welcome, but it's a hobby project in a language I don't get to use in my day job, so I prefer to do all the development myself.
Features
Arithmetic Operations
The add operation adds two values:
dec> 5.5 2.5 show
5.5
2.5
dec> add
8
The sub operation subtracts two values:
dec> 5.5 2.5 show
5.5
2.5
dec> sub
3
The mul operation multiplies two values:
dec> 5.5 2.5 show
5.5
2.5
dec> mul
13.75
The div operation divides two values:
dec> 5.5 2.5 show
5.5
2.5
dec> div
2.2
The mod operation divides two values and finds the remainder:
dec> 5.5 2.5 show
5.5
2.5
dec> mod
0.5
The neg operation finds the negative:
dec> 8 show
8
dec> neg
-8
The inv operation finds the inverse:
dec> 8 show
8
dec> inv
0.125
The pow operation raises to the power:
dec> 3 4 show
3
4
dec> pow
81
The sqrt operation finds the square root:
dec> 100 show
100
dec> sqrt
10
The sum operation sums all values on the stack:
dec> 1 2 3 4 show
1
2
3
4
dec> sum
10
The prod operation multiplies all values on the stack:
dec> 1 2 3 4 show
1
2
3
4
dec> prod
24
Bitwise Operations
The and operation performs a bitwise AND on all bits:
dec> hex
hex> ffff ff00ff show
0000ffff
00ff00ff
hex> and
000000ff
The or operation performs a bitwise OR on all bits:
dec> hex
hex> ffff ff00ff show
0000ffff
00ff00ff
hex> or
00ffffff
The xor operation performs a bitwise XOR on all bits:
dec> hex
hex> ffff ff00ff show
0000ffff
00ff00ff
hex> xor
00ffff00
The shl operation shifts left, i.e. multiplies by a power of 2:
dec> 16 4 show
16
4
dec> shl
256
The shr operation shifts right, i.e. divides by a power of 2:
dec> 16 4 show
16
4
dec> shr
1
Time Operations
The now command gets the current time, showing times in UTC:
dec> now
2024-03-02T11:37:15.724
The plain command converts to an integer or fractional value:
dec> now
2024-03-02T11:37:15.724
dec> plain
1709379435.724
The delta command converts to a delta value, optionally showing days, hours, minutes, seconds and milliseconds:
dec> 86399 show
86399
dec> delta
23:59:59.000
The time command converts to a time value, showing times in UTC:
dec> 1709294400 show
1709294400
dec> time
2024-03-01T12:00:00.000
Delta values can be added to or subtracted from times:
dec> 1709294400 time 86400 delta
2024-03-01T12:00:00.000
1:00:00:00.000
dec> sub
2024-02-29T12:00:00.000
One time value can be subtracted from another:
dec> 1709294400 time 1709208000 time
2024-03-01T12:00:00.000
2024-02-29T12:00:00.000
dec> sub
1:00:00:00.000
Formatting Commands
The dec and hex commands expect and format values as decimal and hexadecimal:
dec> 2 32 pow hex
0000000100000000
hex> dec
4294967296
The sep and nosep commands show and hide a separator for decimal and hexadecimal:
dec> 2 32 pow hex sep
00000001 00000000
hex> dec
4,294,967,296
The dp and nodp commands set and cancel fixed precision for decimal:
dec> 2 sqrt
1.4142135623730951454746218587388284504413604736328125
dec> 0 dp
1
dec> 3 dp
1.414
dec> 6 dp
1.414214
dec> nodp
1.4142135623730951454746218587388284504413604736328125
Stack Commands
The clear command removes all values from the stack:
dec> 1 23 456 show
1
23
456
dec> clear
The pop command removes a value from the stack:
dec> 1 23 456 show
1
23
456
dec> pop
1
23
The dup command duplicates a value on the stack:
dec> 1 23 456 show
1
23
456
dec> dup
1
23
456
456
The swap command swaps two values on the stack:
dec> 1 23 456 show
1
23
456
dec> swap
1
456
23
The cut and copy commands store a value from the stack in the internal clipboard. The paste command copies that value back to the stack:
dec> 1 23 show
1
23
dec> copy
dec> 456 show
1
23
456
dec> paste
1
23
456
23
History Commands
The undo and redo commands undo the last operation, and redo the next operation in the history:
dec> 1 23 456 show
1
23
456
dec> prod
10488
dec> undo
1
23
456
dec> undo
dec> redo
1
23
456
dec> redo
10488
The hist command shows all undo/redo history:
dec> 1 23 456 show
1
23
456
dec> prod
10488
dec> undo
1
23
456
dec> hist
1 23 456
<==
prod