3 个稳定版本
1.2.0 | 2024年6月5日 |
---|---|
1.1.0 | 2024年5月20日 |
1.0.0 | 2024年3月6日 |
在 数学 类别中排名 150
每月下载量 35 次
210KB
4K SLoC
逆波兰式计算器
版本
- 1.0.0
- 初始版本。
- 1.1.0
- 使用
import
指令或--import
选项从文件导入值和操作。 - 使用
export
指令将结果导出到文件。 - 使用
define
指令定义自定义函数。 - 使用
--sum
选项在批处理模式下批量求和值。 - 通过四舍五入到最近的循环小数来纠正浮点数错误。
- 使用
- 1.2.0
- 将十六进制解析和格式化为
0x89ab
。 - 使用
--hex
选项在批处理模式下批量导出十六进制。 - 在批处理模式下或使用
export
指令导出时没有分隔符。
- 将十六进制解析和格式化为
简介
RPN 是一个命令行逆波兰式计算器。作为这样的工具,它将整数和分数数推送到栈上,然后从栈中弹出它们进行操作,在交互式模式下运行。
$ rpn
rpn> 6 7
rpn> show
6
7
rpn> mul
42
它接受命令行提供的文件输入,以批处理模式运行。
$ cat input.txt
6 7
mul
$ rpn input.txt
42
它接受 POSIX shell 命令管道的输入,以批处理模式运行。
$ seq 1 5 | rpn --sum
15
它将输出写入 POSIX shell 命令管道,以批处理模式运行。
$ rpn >output.txt
6 7
mul
$ cat output.txt
42
欢迎提出功能请求,但这是一个在我日常工作中无法使用的语言中的爱好项目,因此我更愿意自己完成所有开发。
程序选项
--command
选项直接从命令行接受输入。
$ rpn --command 6 7 mul
42
--import
选项从文本文件导入值和操作。这可以用于常用的自定义函数。
$ cat defines.txt
define cube 3 pow
define percent 100 div
$ rpn --import defines.txt
rpn> 2 cube
8
如果以批处理模式运行,则 --sum
选项会导致所有结果求和。
$ cat numbers.txt
1 2 3 4 5
$ rpn --sum numbers.txt
15
$ rpn --sum --command 1 2 3 4 5
15
$ seq 1 5 | rpn --sum
15
如果以批处理模式运行,则 --hex
选项会导致结果以十六进制形式打印。
$ rpn --hex --command 10 10 mul
0x00000064
程序功能
一些操作是二元的,例如 add
和 mul
,一些是一元的,例如 neg
和 inv
,一些是零元的,例如 now
,而其他操作则在整个栈上进行,例如 sum
和 prod
。内联帮助提供预期的输入和输出的提示
rpn> 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 Format values as decimal
hex 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 directives:
import F Import file (expect filename)
export F Export file (expect filename)
define K * Define function (expect keyword then values and operations)
General commands:
show Show all values on the stack
help Show this help text
算术运算
add
操作将两个值相加
rpn> 5.5 2.5 show
5.5
2.5
rpn> add
8
sub
操作减去两个值
rpn> 5.5 2.5 show
5.5
2.5
rpn> sub
3
mul
操作乘以两个值
rpn> 5.5 2.5 show
5.5
2.5
rpn> mul
13.75
div
操作除以两个值
rpn> 5.5 2.5 show
5.5
2.5
rpn> div
2.2
mod
操作除以两个值并找到余数
rpn> 5.5 2.5 show
5.5
2.5
rpn> mod
0.5
neg
操作找到负值
rpn> 8 show
8
rpn> neg
-8
inv
操作找到倒数
rpn> 8 show
8
rpn> inv
0.125
pow
操作进行幂运算
rpn> 3 4 show
3
4
rpn> pow
81
sqrt
操作找到平方根
rpn> 100 show
100
rpn> sqrt
10
sum
操作对栈上的所有值求和
rpn> 1 2 3 4 5 show
1
2
3
4
5
rpn> sum
15
prod
操作乘以栈上的所有值
rpn> 1 2 3 4 5 show
1
2
3
4
5
rpn> prod
120
分数表示和浮点错误
RPN对所有操作使用大分数,除非在计算平方根或其他分数幂时,这时它将参数转换为浮点数。为了避免浮点错误,它将所有结果四舍五入到最接近的循环小数。如果没有这个功能,最终结果可能类似于 "2.000000000000000273..."
rpn> 2 sqrt
1.4142135623730951454746218587388284504413604736328125
rpn> dup mul
2
位运算
and
操作对所有位执行位与运算
rpn> 0xffff 0xff00ff hex
0x0000ffff
0x00ff00ff
rpn> and
0x000000ff
or
操作对所有位执行位或运算
rpn> 0xffff 0xff00ff hex
0x0000ffff
0x00ff00ff
rpn> or
0x00ffffff
xor
操作对所有位执行位异或运算
rpn> 0xffff 0xff00ff hex
0x0000ffff
0x00ff00ff
rpn> xor
0x00ffff00
shl
操作左移,即乘以2的幂
rpn> 16 4 show
16
4
rpn> shl
256
shr
操作右移,即除以2的幂
rpn> 16 4 show
16
4
rpn> shr
1
时间运算
now
命令获取当前时间,显示UTC时间
rpn> now
2024-03-02T11:37:15.724
plain
命令转换为整数或分数值
rpn> now
2024-03-02T11:37:15.724
rpn> plain
1709379435.724
delta
命令转换为delta值,可选地显示天、小时、分钟、秒和毫秒
rpn> 86399 show
86399
rpn> delta
23:59:59.000
time
命令转换为时间值,显示UTC时间
rpn> 1709294400 show
1709294400
rpn> time
2024-03-01T12:00:00.000
Delta值可以加到或从时间中减去
rpn> 1709294400 time 86400 delta
2024-03-01T12:00:00.000
1:00:00:00.000
rpn> sub
2024-02-29T12:00:00.000
时间值可以从另一个时间值中减去
rpn> 1709294400 time 1709208000 time
2024-03-01T12:00:00.000
2024-02-29T12:00:00.000
rpn> sub
1:00:00:00.000
格式化命令
dec
和 hex
命令将值格式化为十进制和十六进制
rpn> 2 32 pow hex
0x0000000100000000
rpn> dec
4294967296
sep
和 nosep
命令显示或隐藏十进制和十六进制的分隔符
rpn> 2 32 pow hex sep
0x_00000001_00000000
rpn> dec
4,294,967,296
dp
和 nodp
命令设置和取消十进制的固定精度
rpn> 2 sqrt
1.4142135623730951454746218587388284504413604736328125
rpn> 0 dp
1
rpn> 3 dp
1.414
rpn> 6 dp
1.414214
rpn> nodp
1.4142135623730951454746218587388284504413604736328125
栈命令
clear
命令从栈中删除所有值
rpn> 1 23 456 show
1
23
456
rpn> clear
pop
命令从栈中删除一个值
rpn> 1 23 456 show
1
23
456
rpn> pop
1
23
dup
命令在栈上复制一个值
rpn> 1 23 456 show
1
23
456
rpn> dup
1
23
456
456
swap
命令交换栈上的两个值
rpn> 1 23 456 show
1
23
456
rpn> swap
1
456
23
cut
和 copy
命令将栈上的值存储在内部剪贴板中。 paste
命令将那个值复制回栈
rpn> 1 23 show
1
23
rpn> copy
rpn> 456 show
1
23
456
rpn> paste
1
23
456
23
历史命令
undo
和 redo
命令撤销最后一个操作,并在历史中重做下一个操作
rpn> 1 23 456 show
1
23
456
rpn> prod
10488
rpn> undo
1
23
456
rpn> undo
rpn> undo
Start of undo history
rpn> redo
1
23
456
rpn> redo
10488
rpn> redo
End of undo history
hist
命令显示所有撤销历史
rpn> 1 23 456 show
1
23
456
rpn> prod
10488
rpn> undo
1
23
456
rpn> hist
1 23 456
<==
prod
一般指令
《import
》指令用于从文本文件中导入值和操作;《export
》指令用于将值导出到文本文件。以下创建了一个包含乘法结果的文件
rpn> import params.txt
6
7
rpn> mul
42
rpn> export result.txt
《define
》指令定义了一个自定义函数以供后续使用。自定义函数被添加到内联帮助中
rpn> define cube 3 pow
rpn> define percent 100 div
rpn> help
...
General commands:
show Show all values on the stack
help Show this help text
Defined functions:
cube Function "3 pow"
percent Function "100 div"
注释
可以为任何输入的值或计算结果添加注释。注释将一直附着在其值上,直到被替换,并且(例如)在值被复制时也会被复制
rpn> 6 7
rpn> mul # the answer
42 # the answer
rpn> dup
42 # the answer
42 # the answer
rpn> # deep thought
42 # the answer
42 # deep thought
依赖关系
~8–17MB
~221K SLoC