在不改动lua的其他语法功能的情况下,在lua中添加链表类型的支持,基于lua5.4.0-rc3。
另外会添加一些其他的基础库函数,以方便后续的使用。新添加的函数参照python中对应函数的使用方式(函数名称,参数顺序等)。
- 使用[]定义链表
>a= []
>alist: 000001F666CE2B70- 使用[]获取list的下标,下标从1开始,负数表示从list的末尾开始
>a= [3, 4, 5]
>a[1]
3>a[-1]
5>a[-1] =6>a[-1]
6- 使用#获取list长度
>a= [1, 2, 3]
>#a3- 设置超出范围的下标会自动在list开头或结尾添加数据元素,设置下标0表示在开头插入,设置#a + 1表示在结尾插入
>a[0] =5>a[1], a[2], a[3], a[4]
5123>a[#a+1] =6>a[1], a[2], a[3], a[4], a[5]
51236- 使用+来连接两个list
>a= [1, 2, 3] + [4, 5]
>a[1], a[2], a[3], a[4], a[5]
12345- list可以嵌套定义,注意[[表示字符串开始,因此中间需要添加一个空格
>a= [ []]
>alist: 000001F666CEC030
>a[1]
list: 000001F666CECA80- list可以和table相互嵌套
>a= {1, [2, {3, [4]=5}], [6]=7}
>a[1], a[2], a[6]
1list: 000001B034042C60 7>a[2][1], a[2][2]
2table: 000001B034046CC0
>a[2][2][1], a[2][2][4]
35- 按索引顺序遍历的时间复杂度为O(n),随机遍历的时间复杂度仍为O(n^2)
>a= [1, 2, 3, 4, 5]
>fori=1, 5do>>print(a[i])
>>end12345连接list中从start位置到end位置的所有元素, 元素间以指定的分隔符sep隔开。
在指定的pos位置后插入值为value的元素。
删除pos位置的元素,并返回删除的值,若指定位置元素不存在,则返回nil。
对list进行切片,从start位置开始,end位置结束,步长为step(类似于python中的list[start : end : step])。
将一系列元素打包成list。
返回list中的所有元素。
获取局部变量,将其保存到table中。
将函数转换为生成器,生成器中可以使用yield中断并返回值。
>f=generate(function (a)
>>fori=1, ado>>yield(i, i*2)
>>end>>end)
>>fori, jinf(5) do>>print(i, j)
>>end12243648510将可迭代对象转换成迭代器,可以是table, list, string或者其他迭代器。
>foriiniter([1, 2, 3]) do>>print(i)
>>end123>foriiniter("abc") do>>print(i)
>>endabc将可迭代对象转换成带顺序索引的迭代器,索引计数从1开始。
>fori, vinenumerate([1, 2, 3]) do>>print(i, v)
>>end112233>fori, vinenumerate("abc") do>>print(i, v)
>>end1a2b3c将若干个可迭代对象对应位置的元素依次打包。
>a= {1, 2, 3}
>b= [4, 5, 6]
>c="abc">d=iter("def")
>>fori, j, k, linzip(a, b, c, d) do>>print(i, j, k, l)
>>end14ad25be36cf根据func对后续可迭代对象进行映射。
>a= {1, 2, 3}
>b= [4, 5, 6]
>c="abc">d=iter("def")
>e=generate(function ()
>>yield(11, 12)
>>yield(13, 14)
>>yield(15, 16)
>>end)
>f=function (x1, x2, x3, x4) returnx1, x2, x3, x4end>>fori, j, k, linmap(f, a, b, e()) do>>print(i, j, k, l)
>>end141112251314361516使用func函数对可迭代对象it进行累积。
>f=function(x, y)
>>returnx+y>>end>>g=function(x, y)
>>returnx.."'" ..y>>end>m=map(f, {1, 3, 5, 7, 9}, {2, 4, 6, 8, 10})
>>reduce(f, m)
55>reduce(g, "abcd")
a'b'c'd使用func函数过滤可迭代对象,过滤条件为func函数返回nil, false或无返回值。
>foriinfilter(function (x) returnx>3end, {1, 2, 3, 4, 5}) do>>print(i)
>>end45使用delim分割字符串,num表示分割次数,-1为无限次。
>forkiniter(string.split("abcdefde", "d")) do>>print(k)
>>endabcefelstrip: 去除开头的指定字符。
rstrip: 去除结尾的指定字符。
strip: 去除开头和结尾的指定字符。
c为字符串,表示该字符串中的所有字符都需要去除。
>s="aaabacdefaba">print(string.lstrip(s, "ab"))
cdefaba>print(string.rstrip(s, "ab"))
aaabacdef>print(string.strip(s, "ab"))
cdef