QScript做为一门规划中的解释性语言,我并不希望其是现有语言的直接翻版,因此,重新设计规划其语法。因为是解释性语言,要方便解释器解析识别。
注意本文只是一个构想,并不代表最终一定会实现。
1、变量定义
QScript中变量定义设想声明形式是和C++类似,随用随声明,而不是像Delphi一样,需要在前面声明。如for循环:
for(int i=0;i<100;i++) { }
变量的声明时,多个同一类型的变量声明可以用逗号分隔,不同类型的变量必需使用分号分隔写到下一句。
2、函数声明
QScript的函数声明设想是参数JavaScript和Delphi的语法,支持匿名函数,声明大概如下:
function 函数名称(参数列表) 返回值类型 修饰规则 { 函数代码 }
返回值类型可以用()包括起来,以便返回多个参数值,语法大概如下:
(类型 [名称][,类型2 [名称2]..])
举个简单的例子:
function fun(int x,y) (int dx,dy) stable { return (x,y); } ... a=fun(1,2);
则后面访问a的值时,可以按数组的规则a[0]、a[1]这样子,也可以像对象一样a.dx,a.dy这样子。
修饰规则支持三种:
immutable – 对于相同的参数值,其返回值始终是固定的,而不论其上下文内容。
stable – 对于相同的参数值和上下文内容,其返回值是固定的。
mutable – 易变的,默认规则,即使参数相同,每次执行其返回值也不是固定的。
QScript同时计划支持匿名函数,匿名函数可以直接赋值给一个变量或者做为参数传递给函数。
function a=function(int x,y){return x+y;}
象上面的代码,就可以直接将a在后面做为一个函数来调用。
int b=a(1,2);
QScript的函数不管有没有参数,用于包含参数列表的()都不能省略(这点和C++一致,主要目的是方便解释器解析)。
3、操作符
操作符我的设想是支持引用C/C++中的各种操作符和规则,而不再重新设计。另外,引入Delphi的部分关键词 (暂时考虑 and、or 、 xor 、not、in) 。
4、模块化
复杂的脚本肯定需要模块化以简化维护操作,只是这里需要在C++的#include、Delphi的use和Java的import之间选择一个,我个人倾向于Delphi中的use关键字,简短易记。
5、预声明
如果两个函数中相互引用就会引入预声明的问题,预声明的函数直接没在函数声明完成后没有实现部分即可。类型也是一样。示例如下:
function a(); class b ['{B3EE8BCD-33F8-423F-9AE8-36893E43E8D1}']; class c;
6、调试及日志
直接内置Assert、DebugBreak、DebugOut三个函数以及__DEBUG__全局变量,这三个函数直接在运行只在__DEBUG__启用时会被执行,如果不启用,自动忽略掉。DebugBreak支持条件输出。
7、异常处理
提供try/except/finally语法支持,以便提供异常处理。
8、数据类型
8.1、简单类型
简单类型提供整数(8、16、32、64位有符号和无符号)、浮点(单精度、双精度、扩展精度、货币和BCD编码)、布尔、日期时间(日期、时间、日期时间、时间间隔)、字符串(ANSI、UTF8和Unicode三种)、GUID编码、变体类型、枚举、集合、二进制、数组。
8.2、复合类型
复合类型一般语言提供记录(结构体)、联合(共同体)、接口、类。实质上,它们并没有本质的区别,QScript将不再区分的那么细,只有一种类型class,然后可以为class定义属性、函数和唯一编码(使用GUID编码),提供唯一编码的目的是为类型提供唯一内部标志,以便跨库访问。继承上支持多重继承,对于重名冲突,除非子类重载,否则调用者必需指定父类型的名称,这样子就可以避免多重继承的冲突。
QScript的类型定义可以出现在代码的任何位置,而不象C++、Delphi等必需在前面声明。如下面的类型声明是合法的:
function MyFunction1() { ... class { int Age; String Name; } Baby; Baby.Age=10; Baby.Name="Jone"; ... } fuction MyFunction2() { ... ... class TBaby { int Age; String Name; }; TBaby Baby1,Baby2; Baby1.Age=10; Baby1.Name="Jone"; Baby2.Age=12; Baby2.Name="Deny"; ... }