3 个稳定版本

1.2.0 2024年6月5日
1.1.0 2024年5月20日
1.0.0 2024年3月6日

数学 类别中排名 150

每月下载量 35

GPL-3.0-or-later

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

程序功能

一些操作是二元的,例如 addmul,一些是一元的,例如 neginv,一些是零元的,例如 now,而其他操作则在整个栈上进行,例如 sumprod。内联帮助提供预期的输入和输出的提示

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

格式化命令

dechex 命令将值格式化为十进制和十六进制

rpn> 2 32 pow hex
  0x0000000100000000
rpn> dec
  4294967296

sepnosep 命令显示或隐藏十进制和十六进制的分隔符

rpn> 2 32 pow hex sep
  0x_00000001_00000000
rpn> dec
  4,294,967,296

dpnodp 命令设置和取消十进制的固定精度

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

cutcopy 命令将栈上的值存储在内部剪贴板中。 paste 命令将那个值复制回栈

rpn> 1 23 show
   1
  23
rpn> copy
rpn> 456 show
    1
   23
  456
rpn> paste
    1
   23
  456
   23

历史命令

undoredo 命令撤销最后一个操作,并在历史中重做下一个操作

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