Show HN: val - 一款用 Rust 编写的任意精度计算器语言

terror/val

一款任意精度计算器语言

许可

CC0-1.0 license 2 stars 0 forks Branches Tags Activity Star Notifications You must be signed in to change notification settings

额外导航选项

terror/val

master BranchesTags 转到文件 Code

文件夹和文件

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

release crates.io CI docs.rs dependency status

val (eval) 是一款基于 chumskyariadne 构建的简单任意精度计算器语言。

Screenshot 2025-04-16 at 1 57 23 AM

安装

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 来实现它,并且我们支持一些生活质量功能:

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 支持一些语句结构,例如 ifwhileloopfnreturn 等。 查看 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
}

表达式

val 支持各种可以组合以形成更复杂操作的表达式:

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

val 有几种原始值类型:

数字

数值表示为双精度浮点数:

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))

内置函数

val 提供了大量的内置函数和常量。 以下记录了它们:

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) - 一种任意精度计算器语言

关于

一款任意精度计算器语言

资源

Readme

许可

CC0-1.0 license Activity

Stars

2 stars

Watchers

1 watching

Forks

0 forks 报告存储库

Releases 3

0.2.0 最新 Apr 17, 2025 + 2 个版本

Packages 0

没有发布的包

语言

页脚

© 2025 GitHub, Inc.

页脚导航

You can’t perform that action at this time.