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
,例如:-54
bool
,例如:true
string
,例如:"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