Covariant Script 类型系统

—– «BR»

«Anchor(A1.1)»

grammar}

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

grammar}

grammar}

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

grammar}

grammar}

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

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

'尽量谨慎使用常量',复杂常量的行为取决于实现

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

<tablestyle=“text-align: center; width: 50%”>'形式''赋值(=)''绑定(:=)''声明方法'
<3>变量<3>更改其内存区域的值<3>将变量绑定到其他内存区块上«BR»当内存区块共享时,演变为引用'var'语句
'new'表达式
引用退化
<3>引用<3>更改其引用到的区域的值<3>将引用绑定至其他内存区块上«BR»当内存区块独立时,退化为变量'link'语句
函数参数
变量演变
<2>指针<2>更改其指向的内存区块<2>视同变量'gcnew'表达式
取址('&')表达式

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


«BR»

«Anchor(A1.2)»

'number' 的字面量由 0~9 十个数和小数点组成,如 12,3.14 等

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

'number' 的初始值为0


«BR»

«Anchor(A1.3)»

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

'boolean' 的初始值为 true(真)


«BR»

«Anchor(A1.4)»

'pointer' 没有字面量

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

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

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

grammar}


«BR»

«Anchor(A1.5)»

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

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

'转义序列' '符号'
\a 响铃
\b 退格
\f 换页
\n 换行
\r 回车
\t 水平制表
\v 垂直制表

反斜杠
\' 单引号
\“ 双引号
\0 空字符

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


«BR»

«Anchor(A1.6)»

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

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

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

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

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

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

—– «BR»

«Anchor(A1.7)»

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

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

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

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


«BR»

«Anchor(A1.8)»

'list' 没有字面量

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

'list' 的初始值为空表


«BR»

«Anchor(A1.9)»

1.9 pair(映射)类型

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

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


«BR»

«Anchor(A1.10)»

'hash_map' 没有字面量

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

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

'hash_map' 的初始值为空表

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

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

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