16 个版本 (2 个稳定版)
1.0.1 | 2024 年 3 月 27 日 |
---|---|
0.9.1 | 2023 年 11 月 8 日 |
0.5.1 | 2023 年 7 月 26 日 |
#145 in 数学
每月 600 次下载
155KB
3.5K SLoC
calc_rational
calc_rational 包含一个二进制 crate calc
和一个库 crate calc_lib
。 calc
是一个基于标准运算符优先级和结合性的基本有理数算术的 CLI 计算器。内部,它基于 Ratio<T>
和 BigInt
。
Calc 操作演示
[zack@laptop ~]$ calc
2.71828^0^3.14159 + -1!
> 0
s
> 0
@^0
> 1
s
> 1
@/3 * 3
> 1
s
> 1
|@2 - 9|^(1 - 2*3)
> 1/32768
s
> 1/32768
> 0.000030517578125
round(@, 3)
> 0
round(@, 6)
> 31/1000000
> 0.000031
2/3
> 2/3
> 0.666666667
rand()
> 939435294927814822
rand(1+9,10!)
> 2660936
1+4 mod 2 + 1
> 2
-5 mod 2
> 1
-5 mod -2
> 1
5 mod -2
> 1
9^0.5
> 3
(4/9)^(-1/2)
> 3/2
q
[zack@laptop ~]$
表达式
以下为按优先级降序排列的表达式列表
- 数字字面量,
@
,()
,||
,round()
,rand()
!
^
-
(一元负号运算符)*
,/
,mod
+
,-
所有二元运算符都是左结合,除了 ^
,它是右结合的。
任何表达式都可以用 ()
括起来。请注意,括号纯粹用于分组表达式;特别是,您不能使用它们来表示乘法(例如,4(2)
是语法错误的,并将导致错误信息)。
任何表达式都可以用 ||
括起来。这个一元运算符代表绝对值。
!
是阶乘运算符。由于其优先级高,对于 i, j ∈ ℕ,像 -i!^j! 这样的表达式与 -((i!)^(j!)) 是相同的。如果其前面的表达式不评估为非负整数,则将显示错误。空格和制表符 不会被忽略;因此,1 !
在语法上是错误的,并将导致错误消息。
^
是指数运算符。运算符左侧的表达式可以评估为任何有理数;然而,运算符右侧的表达式必须评估为整数或 ±1/2,除非左侧的表达式评估为 0
或 1
。在第一种情况下,运算符右侧的表达式必须评估为非负有理数。在第二种情况下,运算符右侧的表达式可以评估为任何有理数。注意,0^0
被定义为 1。当 ^
右侧的操作数评估为 ±1/2 时,左侧的操作数必须是某个有理数的平方。
一元运算符 -
表示取反。
运算符 *
和 /
分别表示乘法和除法。除号右侧的表达式必须评估为任何非零有理数;否则,将显示错误。
二元运算符 mod
表示取模,即对于 n,q ∈ ℤ, m ∈ ℤ\{0}, and r ∈ ℕ,有 n mod m = r = n - m*q,其中 r 是最小非负解。
二元运算符 +
和 -
分别表示加法和减法。
除了 !
所述的例外之外,所有在运算符前后和内部的空格和制表符都会被忽略。
四舍五入表达式
round(expression, digit)
将 expression
四舍五入到 digit
位小数。如果调用方式不正确,将显示错误。
随机表达式
rand(expression, expression)
生成一个随机 64 位整数,该整数在传入的表达式之间(包含端点)。如果调用方式不正确,将显示错误。 rand()
生成一个随机的 64 位整数。
数字
数字字面量是非空数字序列,或非空数字序列后紧跟着一个点号 .
,然后紧跟着另一个非空数字序列(例如,134.901
)。这意味着数字字面量精确表示所有与非负整数与唯一质因数是 2 或 5 的正整数的比例相等的有理数。要表示所有其他有理数,必须使用一元运算符 -
和二元运算符 /
。
空表达式
空表达式(即,最多只由空格和制表符组成的表达式)将返回上一个非(空/存储)表达式的结果,以十进制形式表示,使用最小的数字位数。如果需要无限多位数,则将使用常规舍入规则首先将其舍入到9位小数。
存储表达式
要存储上一个非(空/存储)表达式的结果,只需传递 s
。除了存储结果,该结果随后可以通过 @
获取,它还会显示结果。一次最多可以存储8个结果;此时,存储的结果将覆盖最旧的结果。
召回表达式
@
用于召回之前存储的结果。它后面可以跟从 1
到 8
的任何数字。如果没有紧跟这样的数字,则它将被解释为有 1
。 @i
返回第 i 个最前面存储的结果,其中 i ∈ {1, 2, 3, 4, 5, 6, 7, 8}。请注意,空格和制表符不会被忽略,所以 @2
语法错误,会导致错误信息。正如所强调的,它不适用于表达式;所以 @@
和 @(1)
都是语法错误的。
字符编码
所有输入必须只包含以下 Unicode 标量值的 ASCII 编码:0
-9
、.
、+
、-
、*
、/
、^
、!
、mod
、|
、(
、、
round
、rand
、,
、@
、s
、q
。任何其他字节数组都是语法错误的,会导致错误信息。
错误
违反语言规则(例如,除以 0
)的错误会表现为错误信息。向全局标准输出流写入时导致的 panic!
和 io::Error
导致程序终止。在 OpenBSD-stable 上编译时使用 priv_sep
功能,如果 pledge(2)
错误,则承诺 stdio
。
退出
在任何空格和制表符之前和之后使用 q
或发送 EOF
将导致程序终止。
状态
本软件包将积极维护,直到被认为“功能完善”为止。实际上只有两个属性始终为真。首先,生成“合理”语言超集的语法将是一个包含表达式优先级和二元运算符结合性的无歧义上下文无关语法。最后,该语言只处理有理数领域。
这些crate仅在
形式语言规范
为了更精确地指定“calc语言”,可以阅读calc语言规范。
依赖项
~0.5–1MB
~21K SLoC