====== Covariant Script 类型系统 ====== ===== 1.1 定义变量 ===== var 变量名 = 表达式, 变量名 = 表达式... **定义一个或多个变量,初始值为表达式的值**
注意,在 Covariant Script 中,定义变量时必须赋予初始值
link 变量名 = 表达式, 变量名 = 表达式... **定义一个或多个引用,引用到表达式的值** constant 常量名 = 表达式, 常量名 = 表达式...
[慎用,标准扩展] 定义一个或多个常量,其值为表达式的值
常量和变量的处理方式完全不同,常量类似于 C++中的 ''constexpr'' 其实际上**仅存在于编译期**。使用常量将有利于提高性能,编译器在某些情况下也会自动进行常量折叠,但显式声明将帮助编译器更进一步优化您的程序 请**尽量谨慎使用常量**,复杂常量的行为取决于实现,属于解释器扩展的一部分 ----- \\ ===== 1.2 变量的生命周期 ===== CovScript的变量系统中存在三种形式,分别为变量、引用和指针。变量和引用往往可以互相转化 ^ **形式** ^ **赋值(=)** ^ **绑定(:=)** ^ **声明方法** ^ | 变量 | 更改其内存区域的值 | 将变量绑定到其他内存区块上\\ 当内存区块共享时,演变为引用 | **var**语句 | | ::: | ::: | ::: | **new**表达式 | | ::: | ::: | ::: | 引用退化 | | 引用 | 更改其引用到的区域的值 | 将引用绑定至其他内存区块上\\ 当内存区块独立时,退化为变量 | **link**语句 | | ::: | ::: | ::: | 函数参数 | | ::: | ::: | ::: | 变量演变 | | 指针 | 更改其指向的内存区块 | 视同变量 | **gcnew**表达式 | | ::: | ::: | ::: | 取址(**&**)表达式 | 关于绑定的更多信息,参考[[:manual:reference:grammar:expression:main_page#3.3.2.1 绑定 | 绑定表达式]] CovScript 变量的生命周期包括四个阶段: - 诞生(Born) - 存活(Living) - 衰亡(Dying) - 销毁(Destroy) 其中,CovScript 变量的诞生方式包括**声明变量**、''new''和''gcnew'' CovScript 变量在销毁时会调用[[manual:reference:grammar:structure:main_page#析构函数|析构函数]] CovScript 变量的生命周期是由托管者(Settlor)决定的,在 CovScript 标准中共定义了两种托管者: - 栈托管者(Stack Settlor),遵从 RAII 原则管理生命周期 - 堆托管者(Heap Settlor),使用 GC 算法管理生命周期 在 CovScript 3 及之前的标准实现中,堆托管者的 GC 算法是引用计数器(Reference Counter)算法 结合上面提到的 CovScript 变量形式,其中只有变量的生命周期是由栈托管者决定的,引用和指针的生命周期均由堆托管者决定 ===== 1.2 number(数值)类型 ===== ''number'' 的字面量由''0~9''十个数和小数点组成,如 ''12'',''3.14'' 等 ''number'' 表示的数仅限于全体实数 ''number'' 的初始值为''0'' 从语言标准 **210505** 开始,数值类型的实现开始分为整数和浮点两种。默认情况下,数值类型的实现为整数,在精度需要时会自动转换为浮点 要在变量声明时指定类型,可以用''integer''和''float''这两种特化类型 ----- \\ ===== 1.3 boolean(逻辑)类型 ===== ''boolean'' 的字面量只有两个,分别是 ''true''(真)和 ''false''(假) ''boolean'' 的初始值为 ''true''(真) ----- \\ ===== 1.4 pointer(指针)类型 ===== ''pointer'' 没有字面量 ''pointer'' 指向存储在堆空间中的对象,可使用''gcnew''运算符新建一个堆上对象 ''pointer'' 的初始值为''null''(空指针),''null''(空指针)指向一个无意义的对象,不允许解引用一个空指针。不再使用的对象将由 GC(垃圾回收器)自动回收。可使用解引用运算符访问指针指向的对象,若指针指向的是结构体实例,可使用箭头运算符访问结构体的成员
注意,小心环形引用行为,这将造成不可预估的内存泄漏
----- \\ ===== 1.5 char(字符)类型 ===== ''char'' 的字面量是由单引号括起的单个字符,如'''A' ''、'''b' ''、'''#' ''、'''3' ''等 特殊符号需使用转义序列来表示: ^ 转义序列 ^ 符号 ^ | ''\a'' | 响铃 | | ''\b'' | 退格 | | ''\f'' | 换页 | | ''\n'' | 换行 | | ''\r'' | 回车 | | ''\t'' | 水平制表 | | ''\v'' | 垂直制表 | | ''\\'' | 反斜杠 | | '' \' '' | 单引号 | | ''\"'' | 双引号 | | ''\0'' | 空字符 | ''char'' 的初始值为 '''\0' ''(空字符) ----- \\ ===== 1.6 string(字符串)类型 ===== ''string'' 的字面量是由双引号括起的任意个数字符,如''"Hello"'' ''string'' 的初始值为""(空串) 可使用下标运算符访问字符串中的字符,下标不能超出范围(字符串长度-1),小于零时即为倒序访问。多段字符串可以使用加运算符连接 字符串后可跟字面量名,如''"0xff"hex'',称为字符串字面量。用法详见[[:manual:reference:grammar:expression:main_page#3.3.2.1 | 注册字面量【待修复】]] 可以使用 ''to_string()'' 函数将其他类型转换至字符串: ^ 类型 ^ 规则 ^ | **number** | 按字面量转换,精度遵循iostream.setprecision【待修复】的设置 | ----- \\ ===== 1.7 array(数组)类型 ===== ''array'' 的字面量为大括号扩起的以逗号分隔的任意个数元素,如 ''{1,2,3}'' ''array'' 是一种元素均匀分布的顺序容器,初始值为''{}''(空数组) 可使用下标运算符访问数组中的元素,下标小于零时即为倒序访问 Covariant Script 编程语言的数组是变长数组(VLA),若下标超出范围数组将自动增长,增长的部分自动填0 ----- \\ ===== 1.8 list(线性表)类型 ===== ''list'' 没有字面量 ''list'' 是一种元素不均匀分布的顺序容器 ''list'' 的初始值为空表 ----- \\ ===== 1.9 pair(映射)类型 ===== ''pair'' 的字面量为冒号对应的一个键值对,如''2:3'' ''pair'' 的初始值为''0:0''(空映射) ----- \\ ===== 1.10 hash_map 映射(哈希实现)类型 ===== ''hash_map'' 没有字面量 ''hash_map'' 是一种元素均匀分布的无序容器 ''hash_map'' 要求其存储的映射的键的类型必须支持生成哈希值 ''hash_map'' 的初始值为空表 可使用下标运算符访问散列表中的键对应的值,若键不存在,将自动建立键与0组成的映射。 也可以使用点运算符访问散列表中的字符串键对应的值,如与散列表扩展函数冲突则被忽略,若键不存在将触发运行时错误 例如,''map["hello"]'' 可使用 ''map.hello'' 代替,但 ''map.hello'' 不会自动新建映射,而 ''map["hello"]'' 会。 ===== 1.11 hash_set 集合(哈希实现)类型 ===== ''hash_set'' 没有字面量 ''hash_set'' 是一种元素均匀分布的无序容器 ''hash_set'' 要求其存储的变量类型必须支持生成哈希值 ''hash_set'' 的初始值为空表