LeekScript 4

LeekScript 4

> LeekScript

LeekScript 4 是 LeekScript 语言的第四个版本,于 2022 年 7 月 1 日发布。本页汇总了这个版本带来的所有新特性。

数组和映射分离

在 LeekScript 1 到 3 中,数组既是有序的元素序列([1, 2, 3, 4]),又是关联表(['a': 5, 'b': 12])。从 LeekScript 4 开始,这两种用途被拆分成两种不同的类型:数组(Array)和映射(Map)。这两种新类型比原来那个二合一的类型性能更好,用起来也更清晰。

数组 Array 是一串连续的元素,索引从 0 开始,相当于 Java 的 ArrayList 或 C++ 的 vector。可以按位置快速访问某个元素,也可以在任意位置插入或删除元素。

映射 Map 是把键和值关联起来的对象,相当于 Java 的 HashMap 或 C++ 的 unordered_map,其中的(键,值)对是无序的。键可以是任意类型:数字(整数或实数)、字符串、对象等等。可以根据给定的键快速取出对应的值。这种新类型取代了旧数组的“关联”用途。

数组的新函数

内存上限回归

新的数组和映射性能高得多,消耗的操作数也少得多,因此有必要重新设置内存(程序的工作内存)上限:只用很少的操作数,就能轻松占满好几 GB 的内存。

每场战斗中,每个 AI(实体 + 召唤物)的内存上限为 100 MB(在 2.40 更新之前),相当于 12 500 000 个数组、映射或对象元素。这个上限只在 LS4 中生效,因为旧的数组不走这套内存机制:它们本身消耗的操作数已经足够多,用不着这个限制。

新增了 getMaxRAM() 和 getUsedRAM() 两个函数,可以实时监控自己的内存消耗。

整数由 32 位变为 64 位

整数现在用 64 位表示,而此前(在 LeekScript 的所有版本中)是 32 位。位数增加之后,可以用更大的数字做运算,位运算也有了更多的位可用。

箭头函数

现在可以用“箭头函数”语法更简洁地写出匿名函数:

默认参数

在构造函数、方法和静态方法中,现在可以给每个参数指定默认值:

数组的区间访问和负索引

访问数组时新增了两种方式:

== 运算符的改动,=== 运算符弃用

== 运算符以前会做一些容易让人困惑的特殊相等判断,比如 1 == true 或 12 == [12];现在它的行为与 === 运算符一致,而后者则被弃用。

十六进制和二进制数字

除了十进制,现在还可以用十六进制和二进制书写数字(感谢 Karang 的 PR):

var a = 0xabcdef // 11259375 var b = 0b110110101 // 437

数字的“_”分隔符

可以用下划线“_”作为分隔符来书写很长的数字常量,例如:

var un_milliard = 1_000_000_000

回调函数的参数顺序

在 arrayMap、arrayFilter、arrayIter、arrayPartition、arrayFoldLeft/Right 这些函数中,回调函数接收参数的顺序统一为(值,键/索引)。此前的顺序是(键,值),或者只有(值)。

此外,这些函数都会把正在遍历的数组作为第三个参数传给回调函数。

因此可以给回调函数传任意数量的参数,缺少的值会用 null 补上。

函数的改动

参数类型的基础检查

游戏的所有函数都做了精确的类型标注,这样就能在参数与函数期望的类型不兼容时报错。

由于类型推断目前还很初级、以后还会继续演进,这些类型错误暂时只是警告。

a = b = c 的优先级

现在可以不加括号直接写 a = b = c。

映射声明中的重复键

声明映射时,如果同一个键出现两次,会报错(LS4+)或给出警告:

文档中的函数复杂度

文档中会显示每个函数的复杂度。

JSON 对对象和新数组的编码/解码

JSON 函数 jsonEncode 和 jsonDecode 现在支持新的数组和对象:

jsonDecode("[1, 2, 3]"):返回一个新数组

jsonEncode({a: 2, b: 4}) / jsonDecode("{a:2,b:4}"):可以处理对象。

数字相关函数

数字常量

类字段的 final 关键字

可以在类字段前面加上 final 关键字,表示该字段在对象构造完成之后不能再被赋值。赋值指的是使用 = 运算符;如果字段是对象或数组之类的类型,仍然可以修改它的内容。因此,对于 final 的数组字段,要用 arrayClear(objet.champ) 而不是 objet.champ = []。

整除运算符 \ 和 \=

新增了 \ 和 \= 运算符,用来做整数除法(欧几里得除法),例如:

要注意的是,如果两个数字还不是整数,它们会先被转换成整数:

其他修正与改进