1 个不稳定版本
| 0.1.1 | 2022 年 11 月 18 日 |
|---|---|
| 0.1.0 |
|
#1927 在 Rust 模式
每月 33 次下载
70KB
1.5K SLoC
VM_Lang
作为一个有趣的练习,用 Rust 编写的基本解释型编程语言。
基本结构
用此语言编写的程序由多个函数组成,其中必须有一个名为 main 的函数,该函数不接受任何参数,返回类型为 void。
函数
有一个名称,一组参数以及可选的返回类型,后面跟着一个语句块。
示例
fn some_func(a: int, b: [string]): boolean {
// Statements
return true
}
如果一个函数有返回类型,它必须在函数的每个路径上使用 return 语句,否则返回是可选的。
注释
一行中的任何文本(除非双斜杠 // 在字符串字面量内)在行后都是被忽略的。
语句
Let
声明一个变量,类型是推断的。
示例
let a = 0;
While
当提供的表达式为真时继续循环的循环。
示例
while true {
// Statements
}
For
遍历列表的 for-each 循环。
示例
let some_list = [1, 4, 9];
for (a in some_list) {
// Statements
}
If
一个分支语句,当表达式为真时运行块。
示例
if true {
// Statements
}
If else
一个分支语句,当表达式为真时运行第一个块,否则运行 else 块。
示例
let i = 4;
if i < 2 {
// Statements
} else {
// Statements
}
返回类型
使用提供的表达式从当前函数返回,表达式的类型必须与函数的返回类型相同。
示例
return 54;
返回 void
当函数的返回类型为 void 时从当前函数返回。
示例
return;
表达式
以分号 ; 结尾的表达式也是一个语句。
示例
i++;
块
封装一组语句以创建新的作用域。
示例
{
// Statements
}
表达式
语言中有许多表达式,按照优先级排序如下:
赋值
重新分配先前声明的变量。
示例
a = 2;
比较
比较两个相同类型的表达式,返回布尔值。
只支持布尔表达式的比较: - || | 'or' 为真,如果任一表达式为真。 - && | 'and' 为真,如果两个表达式都为真。
支持所有类型的比较:- == 或 equals 表示表达式相同。 - != 或 not equals 表示表达式不相同。 - <= 或 Less than or equal to 表示第一个表达式小于或等于第二个表达式。 - >= 或 Greater than or equal to 表示第一个表达式大于或等于第二个表达式。 - < 或 Less than 表示第一个表达式严格小于第二个表达式。 - > 或 Greater than 表示第一个表达式严格大于第二个表达式。
示例
2 < 4
算术运算
在类型为 int 的两个表达式之间执行算术运算。
当前支持的算术运算包括
+| 加-| 减*| 乘/| 除
示例
2 + 4
一元运算
对单个表达式进行的运算。
当前支持的一元运算包括
!| 非++| 将值增加 1,根据该操作是在表达式之前还是之后,这将在读取值之前或之后完成。--| 将值减少 1,根据该操作是在表达式之前还是之后,这将在读取值之前或之后完成。
示例
i++;
函数调用
调用一个函数。
示例
some_func(42, "this function has two args");
列表索引
通过索引从列表中检索值。
示例
let some_list = [1, 5, 9];
some_list[1]; // Returns 5
字面量
任何可用的类型(除 void 外)的字面量。
示例
54
括号表达式
任何括号内的表达式。
示例
(1 + 2)
类型
当前语言中有四种类型可用
int,例如:-54bool,例如:truestring,例如:"Hello! This is a string"- 列表,声明为
[TYPE],其中TYPE可以是上述任何类型,例如:[0, 1, 99, 200] void,从不直接使用,但在没有声明其他类型时使用,例如没有返回类型的函数。
内置函数
提供了一些内置函数以执行特定任务。
print_number
将数字打印到标准输出。
参数:- number: int | 要打印的数字。
返回:`Void
print_string
将字符串打印到标准输出。
参数:- text: string | 要打印的字符串。
返回:Void
print_bool
将布尔值打印到标准输出。
参数:- val: bool | 要打印的布尔值。
返回:Void
read_number
从标准输入读取一个数字。
参数:None
返回:- number: int | 读取到的数字。
read_string
从标准输入读取一个字符串。
参数:None
返回:- val: string | 读取到的字符串。
read_bool
从标准输入读取一个布尔值。
参数:None
返回:- val: bool | 读取到的布尔值。
read_file
给定一个路径,将文件内容读取为字符串。
参数:- file_path: string | 相对于当前目录的文件路径。
返回:- file_content: string | 文件内容。
split_string
给定一个字符串和一个'分隔符',在每个'分隔符'出现的位置分割字符串,返回包含各部分的列表。
参数:- text: string | 要分割的文本。 - splitter: string | 分隔文本的文本。
返回:- parts: [string] | 包含通过每个splitter分割的text的每个部分的列表。
parse_int
将字符串解析为数字。
参数:- text: string | 要解析的文本。
返回:- num: int | 解析的文本。
依赖
~2.4–5.5MB
~89K SLoC