1 stable release
1.0.0 | Mar 6, 2024 |
---|
#345 in Math
152 downloads per month
175KB
3K
SLoC
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
Dependencies
~10MB
~182K SLoC