> 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。可以按位置快速访问某个元素,也可以在任意位置插入或删除元素。
array[10] = v 这种写法随手创建元素。Map)。Array 类型使用文档中“数组”类别的全部函数。映射 Map 是把键和值关联起来的对象,相当于 Java 的 HashMap 或 C++ 的 unordered_map,其中的(键,值)对是无序的。键可以是任意类型:数字(整数或实数)、字符串、对象等等。可以根据给定的键快速取出对应的值。这种新类型取代了旧数组的“关联”用途。
Map 类型使用文档中“映射”类别的全部函数,它们都以“map”为前缀。var table = [:]var table = new Map()arraySome(liste, predicat):只要数组中至少有一个元素让 predicat 返回 true,就返回 true。arrayEvery(liste, predicat):如果数组中所有元素都让 predicat 返回 true,则返回 true。removeAll(liste, element):删除数组中所有值为“element”的元素。arrayFrequencies(liste):返回一个把(元素 => 数量)关联起来的映射。arrayChunk(liste, taille):返回一个数组,其中包含若干个大小为 N 的子数组。arrayUnique(liste):返回一个去掉了重复元素的新数组。arrayRandom(liste, n):返回一个由 N 个随机元素组成的数组。新的数组和映射性能高得多,消耗的操作数也少得多,因此有必要重新设置内存(程序的工作内存)上限:只用很少的操作数,就能轻松占满好几 GB 的内存。
每场战斗中,每个 AI(实体 + 召唤物)的内存上限为 100 MB(在 2.40 更新之前),相当于 12 500 000 个数组、映射或对象元素。这个上限只在 LS4 中生效,因为旧的数组不走这套内存机制:它们本身消耗的操作数已经足够多,用不着这个限制。
新增了 getMaxRAM() 和 getUsedRAM() 两个函数,可以实时监控自己的内存消耗。
整数现在用 64 位表示,而此前(在 LeekScript 的所有版本中)是 32 位。位数增加之后,可以用更大的数字做运算,位运算也有了更多的位可用。
现在可以用“箭头函数”语法更简洁地写出匿名函数:
在构造函数、方法和静态方法中,现在可以给每个参数指定默认值:
访问数组时新增了两种方式:
liste[-1] 返回最后一个,liste[-2] 返回倒数第二个。liste[10:20] 返回一个新数组,包含从位置 10(含)到 20(不含)的元素。liste[10:20:3] 返回位置 10、13、16、19 上的元素。liste[20:10:-3] 返回位置 20、17、14、11 上的元素subArray 的 arraySlice(start, end, increment) 函数,行为与 liste[start:end:increment] 语法完全相同。== 运算符以前会做一些容易让人困惑的特殊相等判断,比如 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 补上。
subArray 函数的 end 位置不再包含在内。removeElement 函数不再留下空洞。arrayFlatten 函数不再复制元素。assocReverse、assocSort、keySort 函数被删除,removeKey 由 mapRemove 取代。arrayMin 的开销。randFloat 更名为 randReal。codePointAt(string, [index]):返回字符串中 index 位置(默认为 0)上的 Unicode 码点(整数)。游戏的所有函数都做了精确的类型标注,这样就能在参数与函数期望的类型不兼容时报错。
由于类型推断目前还很初级、以后还会继续演进,这些类型错误暂时只是警告。
现在可以不加括号直接写 a = b = c。
声明映射时,如果同一个键出现两次,会报错(LS4+)或给出警告:
文档中会显示每个函数的复杂度。
JSON 函数 jsonEncode 和 jsonDecode 现在支持新的数组和对象:
jsonDecode("[1, 2, 3]"):返回一个新数组
jsonEncode({a: 2, b: 4}) / jsonDecode("{a:2,b:4}"):可以处理对象。
bitCount(x):返回该数字中值为 1 的位的个数。trailingZeros(x):返回该数字末尾连续为 0 的位数。leadingZeros(x):返回该数字开头连续为 0 的位数。bitReverse(x):返回一个新数字,其所有位从左到右反转。byteReverse(x):返回一个新数字,其所有字节(8 位一组)从左到右反转。rotateLeft(x, y):返回一个新数字,各位向左移动 y 位(移出的位从右边补回)。rotateRight(x, y):返回一个新数字,各位向右移动 y 位(移出的位从左边补回)。hexString(x):返回以十六进制表示该数字的字符串。binString(x):返回以二进制表示该数字的字符串。realBits(x):以整数的形式返回该数字的各个位。bitsToReal(x):根据存放在整数中的位,返回一个实数。isFinite(x):判断数字 x 是否为有限数。isInfinite(x):判断数字 x 是否为无穷大。isNaN(x):判断数字 x 是否为 NaN 值。isPermutation(x, y):如果数字 x 是数字 y 的一个排列,则返回 true。NaN:表示 NaN 值的常量。X == NaN 永远等于 false(所以才有 isNaN 函数)。Infinity:表示无穷大的常量。要得到它的相反数,使用 -Infinity。Integer.MIN_VALUE 和 Integer.MAX_VALUE:最小整数(-2^63 = -9223372036854775808)和最大整数(2^63-1 = 9223372036854775807)Real.MIN_VALUE 和 Real.MAX_VALUE:最小实数(2.2250738585072014e-308)和最大实数(1.7976931348623157e308)final 关键字可以在类字段前面加上 final 关键字,表示该字段在对象构造完成之后不能再被赋值。赋值指的是使用 = 运算符;如果字段是对象或数组之类的类型,仍然可以修改它的内容。因此,对于 final 的数组字段,要用 arrayClear(objet.champ) 而不是 objet.champ = []。
\ 和 \=新增了 \ 和 \= 运算符,用来做整数除法(欧几里得除法),例如:
要注意的是,如果两个数字还不是整数,它们会先被转换成整数:
debug([10, "20", "salut"]) 现在输出 [10, "20", "salut"],而不是 [10, 20, salut]。break 和 continue 的一个 bug。A['m'] 和 var m = A.m 使用静态方法时的若干 bug。-1,而不再是 null。Impossible de charger les données du jeu.
Vérifiez votre connexion et réessayez.