Show HN: val – An arbitrary precision calculator language written in Rust
Show HN: val - 一款用 Rust 编写的任意精度计算器语言
terror/val
- Notifications You must be signed in to change notification settings
- Fork 0
- Star 2
一款任意精度计算器语言
许可
CC0-1.0 license 2 stars 0 forks Branches Tags Activity Star Notifications You must be signed in to change notification settings
额外导航选项
terror/val
文件夹和文件
Name| Name| Last commit message| Last commit date ---|---|---|---
最新提交
历史
100 Commits .github/workflows| .github/workflows bin| bin crates/val-wasm| crates/val-wasm examples| examples src| src tests| tests www| www .editorconfig| .editorconfig .gitattributes| .gitattributes .gitignore| .gitignore CONTRIBUTING| CONTRIBUTING Cargo.lock| Cargo.lock Cargo.toml| Cargo.toml GRAMMAR.txt| GRAMMAR.txt LICENSE| LICENSE README.md| README.md justfile| justfile mise.toml| mise.toml rustfmt.toml| rustfmt.toml 查看所有文件
仓库文件导航
val
val (eval) 是一款基于 chumsky 和 ariadne 构建的简单任意精度计算器语言。
安装
val
应该可以在任何系统上运行,包括 Linux、MacOS 和 BSD。
安装它的最简单方法是使用 cargo,即 Rust 包管理器:
cargo install val
预构建二进制文件
可以在发布页面上找到适用于 Linux、MacOS 和 Windows 的预构建二进制文件。
用法
使用 val 的主要方式是通过提供的命令行界面。 目前正在进行一个 Rust 库和 Web Playground 的工作,这将提供一些与运行时交互的额外方式。
以下是 val --help
的输出,它描述了我们支持的一些参数/选项:
Usage: val [OPTIONS] [FILENAME]
Arguments:
[FILENAME]
Options:
-e, --expression <EXPRESSION>
-h, --help Print help
-V, --version Print version
单独运行 val 将会生成一个 repl (read–eval–print loop) 环境,您可以在其中评估任意 val 代码并立即查看其输出。 我们使用 rustyline 来实现它,并且我们支持一些生活质量功能:
- 语法高亮(见上图)
- 持久的命令历史记录
- 默认情况下支持 Emacs 风格的编辑
- 文件名补全
- 提示(从历史记录中提取的虚拟文本)
val 语言不仅支持表达式,还支持相当多的语句。 您可能想要保存 val 程序并在以后执行它们,因此命令行界面提供了一种评估整个文件的方式。
例如,假设您在 factorial.val
中有以下 val 程序:
fn factorial(n) {
if (n <= 1) {
return 1
} else {
return n * factorial(n - 1)
}
}
println(factorial(5));
您可以通过运行 val factorial.val
来执行此程序,该程序将写入标准输出 120
。
最后,您可能想要评估一个 val 表达式并在另一个程序中使用它。 该工具支持使用 --expression
或 -e
选项内联执行任意表达式:
val -e 'sin(2) * e ^ pi * cos(sum([1, 2, 3]))'
16.481455793912883
注意: --expression
选项和 filename
参数是互斥的。
功能
本节详细描述了 val 实现的一些语言功能,并且应该作为想要编写 val 程序的任何人的指南。
语句
val 支持一些语句结构,例如 if
、while
、loop
、fn
、return
等。 查看 grammar 以获取所有各种语句类型。
这是一个展示了其中大多数功能的示例:
fn fib(n) {
if (n <= 1) { return n }
return fib(n - 1) + fib(n - 2)
}
i = 0
while (i < 10) {
println('fib(' + i + ') = ' + fib(i))
i = i + 1
}
表达式
Category | Operation | Syntax | Example
---|---|---|---
算术 | 加法 | a + b
| 1 + 2
减法 | a - b
| 5 - 3
乘法 | a * b
| 4 * 2
除法 | a / b
| 10 / 2
取模 | a % b
| 7 % 3
幂运算 | a ^ b
| 2 ^ 3
取反 | -a
| -5
逻辑 | 与 | a && b
| true && false
或 | a || b
| true || false
非 | !a
| !true
比较 | 等于 | a == b
| x == 10
不等于 | a != b
| y != 20
小于 | a < b
| a < b
小于或等于 | a <= b
| i <= 5
大于 | a > b
| count > 0
大于或等于 | a >= b
| value >= 100
其他 | 函数调用 | function(args)
| sin(x)
列表索引 | list[index]
| numbers[0]
列表创建 | [item1, item2, ...]
| [1, 2, 3]
列表连接 | list1 + list2
| [1, 2] + [3, 4]
字符串连接 | string1 + string2
| "Hello, " + name
变量引用 | identifier
| x
值
数字
x = 42
y = 3.14159
z = -5
布尔值
a = true
b = false
c = a && b
d = a || b
e = !a
字符串
greeting = "Hello"
name = 'World'
message = greeting + ", " + name + "!"
列表
numbers = [1, 2, 3, 4, 5]
mixed = [1, "two", true, [3, 4]]
empty = []
first = numbers[0]
numbers[0] = 10
combined = numbers + [6, 7]
函数
函数是一个值,可以用于赋值,传递给其他函数等。 查看 higher order functions example 了解其工作原理。
fn reduce(l, f, initial) {
i = 0
result = initial
while (i < len(l)) {
result = f(result, l[i])
i = i + 1
}
return result
}
fn sum(a, b) {
return a + b
}
l = [1, 2, 3, 4, 5]
println(reduce(l, sum, 0))
内置函数
Category | Function/Constant | Description | Example
---|---|---|---
常量 | pi
| 数学常量 π (≈3.14159) | area = pi * r^2
e
| 数学常量 e (≈2.71828) | growth = e^rate
三角函数 | sin(x)
| x 的正弦(弧度) | sin(pi/2)
cos(x)
| x 的余弦(弧度) | cos(0)
tan(x)
| x 的正切(弧度) | tan(pi/4)
csc(x)
| x 的余割(弧度) | csc(pi/6)
sec(x)
| x 的正割(弧度) | sec(0)
cot(x)
| x 的余切(弧度) | cot(pi/4)
反三角函数 | asin(x)
| 反正弦 (-1≤x≤1) | asin(0.5)
acos(x)
| 反余弦 (-1≤x≤1) | acos(0.5)
arc(x)
| 反正切 | arc(1)
acsc(x)
| 反余割 (abs(x)≥1) | acsc(2)
asec(x)
| 反正割 (abs(x)≥1) | asec(2)
acot(x)
| 反余切 | acot(1)
双曲函数 | sinh(x)
| 双曲正弦 | sinh(1)
cosh(x)
| 双曲余弦 | cosh(1)
tanh(x)
| 双曲正切 | tanh(1)
对数函数 | ln(x)
| 自然对数 | ln(e)
log2(x)
| 以 2 为底的对数 | log2(8)
log10(x)
| 以 10 为底的对数 | log10(100)
e(x)
| e 的 x 次方 | e(2)
数值函数 | sqrt(x)
| 平方根 (x≥0) | sqrt(16)
ceil(x)
| 向上取整为整数 | ceil(4.3)
floor(x)
| 向下取整为整数 | floor(4.7)
abs(x)
| 绝对值 | abs(-5)
集合函数 | len(x)
| 列表或字符串的长度 | len("hello")
sum(list)
| 列表元素求和 | sum([1,2,3])
转换函数 | int(x)
| 转换为整数 | int("42")
float(x)
| 转换为浮点数 | float("3.14")
bool(x)
| 转换为布尔值 | bool(1)
list(x)
| 转换为列表 | list("abc")
I/O | print(...)
| 不带换行符的打印 | print("Hello")
println(...)
| 带换行符的打印 | println("World")
input([prompt])
| 从标准输入读取一行 | name = input("Name: ")
字符串函数 | split(str, delim)
| 分割字符串 | split("a,b,c", ",")
join(list, delim)
| 连接列表元素 | join(["a","b"], "-")
程序函数 | exit([code])
| 退出程序 | exit(1)
quit([code])
| exit 的别名 | quit(0)
先前技术
bc(1) - 一种任意精度计算器语言
关于
一款任意精度计算器语言
资源
许可
Stars
Watchers
Forks
Releases 3
Packages 0
没有发布的包
语言
页脚
页脚导航
You can’t perform that action at this time.