Covariant Script 类型系统



var 变量名 = 表达式, 变量名 = 表达式...

定义一个或多个变量,初始值为表达式的值

注意,在 Covariant Script 中,定义变量时必须赋予初始值

link 变量名 = 表达式, 变量名 = 表达式...

定义一个或多个引用,引用到表达式的值

constant 常量名 = 表达式, 常量名 = 表达式...

[慎用,标准扩展] 定义一个或多个常量,其值为表达式的值

常量和变量的处理方式完全不同,常量类似于 C++中的 constexpr

其实际上仅存在于编译期。使用常量将有利于提高性能,编译器在某些情况下也会自动进行常量折叠,但显式声明将帮助编译器更进一步优化您的程序

尽量谨慎使用常量,复杂常量的行为取决于实现,属于解释器扩展的一部分



CovScript的变量系统中存在三种形式,分别为变量、引用和指针。变量和引用往往可以互相转化

形式 赋值(=) 绑定(:=) 声明方法
变量 更改其内存区域的值 将变量绑定到其他内存区块上当内存区块共享时,演变为引用 var语句
new表达式
引用退化
引用 更改其引用到的区域的值 将引用绑定至其他内存区块上当内存区块独立时,退化为变量 link语句
函数参数
变量演变
指针 更改其指向的内存区块 视同变量 gcnew表达式
取址(&)表达式

关于绑定的更多信息,参考 绑定表达式

CovScript 变量的生命周期包括四个阶段:

  1. 诞生(Born)
  2. 存活(Living)
  3. 衰亡(Dying)
  4. 销毁(Destroy)

其中,CovScript 变量的诞生方式包括声明变量newgcnew

CovScript 变量在销毁时会调用析构函数

CovScript 变量的生命周期是由托管者(Settlor)决定的,在 CovScript 标准中共定义了两种托管者:

  1. 栈托管者(Stack Settlor),遵从 RAII 原则管理生命周期
  2. 堆托管者(Heap Settlor),使用 GC 算法管理生命周期

在 CovScript 3 及之前的标准实现中,堆托管者的 GC 算法是引用计数器(Reference Counter)算法

结合上面提到的 CovScript 变量形式,其中只有变量的生命周期是由栈托管者决定的,引用和指针的生命周期均由堆托管者决定

number 的字面量由0~9十个数和小数点组成,如 123.14

number 表示的数仅限于全体实数

number 的初始值为0



boolean 的字面量只有两个,分别是 true(真)和 false(假)

boolean 的初始值为 true(真)



pointer 没有字面量

pointer 指向存储在堆空间中的对象,可使用gcnew运算符新建一个堆上对象

pointer 的初始值为null(空指针),null(空指针)指向一个无意义的对象,不允许解引用一个空指针。不再使用的对象将由

GC(垃圾回收器)自动回收。可使用解引用运算符访问指针指向的对象,若指针指向的是结构体实例,可使用箭头运算符访问结构体的成员

注意,小心环形引用行为,这将造成不可预估的内存泄漏



char 的字面量是由单引号括起的单个字符,如'A' 'b' '#' '3'

特殊符号需使用转义序列来表示:

转义序列 符号
\a 响铃
\b 退格
\f 换页
\n 换行
\r 回车
\t 水平制表
\v 垂直制表
\\ 反斜杠
\' 单引号
\“ 双引号
\0 空字符

char 的初始值为 '\0' (空字符)



string 的字面量是由双引号括起的任意个数字符,如“Hello”

string 的初始值为”“(空串)

可使用下标运算符访问字符串中的字符,下标不能超出范围(字符串长度-1),小于零时即为倒序访问。多段字符串可以使用加运算符连接

字符串后可跟字面量名,如“0xff”hex,称为字符串字面量。用法详见 注册字面量【待修复】

可以使用 to_string() 函数将其他类型转换至字符串:

类型 规则
number 按字面量转换,精度遵循iostream.setprecision【待修复】的设置


array 的字面量为大括号扩起的以逗号分隔的任意个数元素,如 {1,2,3}

array 是一种元素均匀分布的顺序容器,初始值为{}(空数组)

可使用下标运算符访问数组中的元素,下标小于零时即为倒序访问

Covariant Script 编程语言的数组是变长数组(VLA),若下标超出范围数组将自动增长,增长的部分自动填0



list 没有字面量

list 是一种元素不均匀分布的顺序容器

list 的初始值为空表



pair 的字面量为冒号对应的一个键值对,如2:3

pair 的初始值为0:0(空映射)



hash_map 没有字面量

hash_map 是一种元素均匀分布的无序容器

hash_map 要求其存储的映射的键的类型必须支持生成哈希值

hash_map 的初始值为空表

可使用下标运算符访问散列表中的键对应的值,若键不存在,将自动建立键与0组成的映射。

也可以使用点运算符访问散列表中的字符串键对应的值,如与散列表扩展函数冲突则被忽略,若键不存在将触发运行时错误

例如,map[“hello”] 可使用 map.hello 代替,但 map.hello 不会自动新建映射,而 map[“hello”] 会。

hash_set 没有字面量

hash_set 是一种元素均匀分布的无序容器

hash_set 要求其存储的变量类型必须支持生成哈希值

hash_set 的初始值为空表