宋子桓开发的一个语言(VirtualMath Language)。

SongZihuan 097aeda477 style: 修改VirtualMathCore为vmcore 4 lat temu
argument e459de7d6b feat: 添加cmake参数 4 lat temu
include c3874ac47b fix: 修复了使用gcc编译器无法编译args的问题 4 lat temu
src 570393adda feat: 支持exec函数 4 lat temu
vmcore 097aeda477 style: 修改VirtualMathCore为vmcore 4 lat temu
vmlib e19ab5ee64 fix: 修改vm_lib名字 4 lat temu
.gitignore 8aea6f8b93 update: 更新.gitignore 4 lat temu
CMakeLists.txt 097aeda477 style: 修改VirtualMathCore为vmcore 4 lat temu
README.md ebaef6bae2 docx: 更新README.md 4 lat temu
main.c df1602ac75 feat: 字符串和匹配器使用宽字符 4 lat temu

README.md

VirtualMath

什么是VirtualMath

VirtualMath是基于C语言实现的动态强类型解释形编程语言,使用VirtualMathCore解释器解释执行。

项目分为两部分:

  1. VirtualMathCoreVirtualMath核心,包括parser文本解析器和vm运行器。
  2. VMHello是使用VirtualMathCore的可视化编程工具,使用基于命令行模式。

项目编译

使用cmake生成项目Makefile文件后使用makemake install工具进行编译和安装。

cmake支持参数包括:

  1. GC,默认为ON状态表示编译GC模块,否则不编译GC模块
  2. CMAKE_BUILD_TYPE,指定编译类型,设置为Debug的时候可以编译Debug程序。

使用VirtualMath

VirtualMath支持如下命令行参数:

-n 不进入command line模式
--stdout xxx 指定标准输出的位置
--stderr xxx 指定标准错误的位置
--stdin xxx 指定标准输入的位置

注意以上设定的标准输入\输出\错误的位置只适用于解释器所运行的VM代码。

命令行参数末尾的单独参数被解释为vm文件名,将交由VirtualMathCore逐一解释执行。

VirtualMath语法

字面量

支持字面量数字和字面量字符串

10
20.3
"Hello"
'World'

注意,字符串暂不支持转义字符串。

注意,解析器允许使用小数但VirtualMathCore仅支持整数。

字面量后缀

VirtualMath支持使用字面量后缀。

如,123i等价于i(123)。关于回调将会在后面详细说明。

变量

VritaulMath变量分为普通变量和超级变量。

普通变量名(标识符)由下划线或字母开头,仅包含下划线、字母和数字的字符组成,且为非关键词。

_
_a
a_
_23
a23
a_23

以上均为合法变量名

23a
23_
if

以上为非法的变量名

超级变量由$开头后跟表达式,如:

$10
$(20 + 30)

因此,VirtualMath允许使用数字等其他类型的数据作为变量名。但其访问时必须使用$符号。

关于$的优先级:

$20+30 等价于 ($20) + 30

运算

VirtualMath支持如下运算:

加法和减法

10 + 20
20 + 30
"Hello" + " World"
100 - 200
500 - 100

乘法和除法

10 * 30
5 / 4
"Hello" * 3

赋值运算

a = 10
b = 20
20 = 30
$(20) = 30

其中20 = 30是等价于$(20) = 30的,也许会引起一些争议,但别紧张你会习惯的。

同时,还有特殊类型的赋值语句:

a[2] = 10
a[2:3] = z

注意,该赋值并非$(a[2]) = 10,这种赋值方式需要对象尊需一定协议才可使用,具体在后面将会介绍。

同时,也支持如下赋值语句:

f(x, y) = x * y

注意,以上语句并不等价于$(f(x, y)) = x * y,他其实是一种简单地函数定义,等价于:

def f(x, y){
	return x * y
}

分支语句

条件分支

do {

} if (xxx) {

} elif (xxx) as f{

} do{

} elif (xxx) {

} else {

} finally{

}

语句自上而下执行,遇到do语句会直接执行do语句内的代码并且继续执行。遇到if或者elif分支则会判断条件,然后赋值结果,再执行内部代码块,然后调准到finally分支。finally分支是条件分支离开前必然会执行的,即便条件分支内发生错误(VirtualMathCoreHelloVM的错误除外)。

循环分支

do{
# 循环前执行一次
} while (xxx) as f{

} do {
# 每次循环后执行一次(break除外)
} else {

} finally{

}

else分支只有当while中的条件为false的时候才会执行。当循环体内使用了break语句跳出循环的时候else不会执行。

遍历分支

do {

} for i in a{

} do {

} else {

} finally {

}

for循环的do分支和while循环类似。else分支只有当迭代结束的时候才会执行。当循环体内使用了break语句跳出循环的时候else不会执行。

do…循环

do while (xxx) as f{

} do {

} else {

} finally {

}

该循环并没有将条件判断后置,而是对首次条件判断的结果忽略并且设定为True

错误捕获分支

try {

} except {

} except as e{

} except xxx {

} except xxx as e {

} else {

} finally {

}

with分支

with xxx {

} else {

} finally {

}

with xxx as f{

} else {

} finally {

}

更多特性

VirtualMath还有很多特性,可自行探索。