柚子快報(bào)激活碼778899分享:Lua語(yǔ)言入門
柚子快報(bào)激活碼778899分享:Lua語(yǔ)言入門
目錄
Lua語(yǔ)言1 搭建Lua開發(fā)環(huán)境1.1 安裝Lua解釋器WindowsLinux
1.2 IntelliJ安裝Lua插件在線安裝本地安裝
2 Lua語(yǔ)法2.1 數(shù)據(jù)類型2.2 變量全局變量局部變量命名規(guī)范局部變量作用域
2.3 注釋單行注釋多行注釋
2.4 賦值2.5 操作符數(shù)學(xué)操作符比較操作符邏輯操作符連接操作符取長(zhǎng)度操作符操作符優(yōu)先級(jí)
2.6 if語(yǔ)句2.7 循環(huán)語(yǔ)句whilerepeatfor
2.8 表類型對(duì)象數(shù)組遍歷表
2.9 函數(shù)
3 標(biāo)準(zhǔn)庫(kù)3.1 Base庫(kù)3.2 String庫(kù)3.3 Table庫(kù)3.4 Math庫(kù)3.5 Debug庫(kù)debug.getinfo(f, what)參數(shù)舉例
3.6 cjson 庫(kù)和 cmsgpack庫(kù)
4 安裝擴(kuò)展庫(kù)4.1 安裝LuaRocksWindowsLinux
4.2 安裝鏈接庫(kù)和頭文件4.3 配置LuaRocks4.4 安裝GCC編譯器4.5 安裝CJson庫(kù)4.6 安裝cmsgpack庫(kù)
5 構(gòu)建Lua解釋器6 構(gòu)建LuaRocks
Lua語(yǔ)言
Lua 是一種高效的輕量級(jí)腳本語(yǔ)言。Lua 在葡萄牙語(yǔ)中是“月亮”的意思,它的徽標(biāo) 形似衛(wèi)星,寓意著Lua是一種“衛(wèi)星語(yǔ)言”,能夠方便地嵌入其他編程語(yǔ)言中使用。lua語(yǔ)法簡(jiǎn)單,小巧,源碼一共才200多K,本身不會(huì)有太強(qiáng)的功能。
很多人都希望在Redis中加入各種各樣的命令,這些命令中有的確實(shí)很實(shí)用,但可以使用多個(gè)Redis已有的命令實(shí)現(xiàn)。在Redis中包含開發(fā)者需要的所有命令顯然是不現(xiàn)實(shí)的,所以Redis在2.6版中提供了Lua腳本功能來(lái)讓開發(fā)者自己擴(kuò)展Redis。
官方網(wǎng)站:https://www.lua.org/
IntelliJ Lua插件:https://plugins.jetbrains.com/plugin/9768-emmylua
1 搭建Lua開發(fā)環(huán)境
1.1 安裝Lua解釋器
Windows
首先從官網(wǎng)上下載可執(zhí)行程序包: https://jaist.dl.sourceforge.net/project/luabinaries/5.4.2/Tools%20Executables/lua-5.4.2_Win64_bin.zip
解壓到本地目錄,并將此目錄添加到環(huán)境變量path,例如: D:\00_programming\07_apps\lua-5.4.2_Win64_bin
打開命令行窗口,運(yùn)行命令:
>lua54
Lua 5.4.2 Copyright (C) 1994-2020 Lua.org, PUC-Rio
>
Linux
To be added…
1.2 IntelliJ安裝Lua插件
在線安裝
打開插件市場(chǎng)File>Settings>Plugins>Marketplace,搜索EmmyLua和EmmyLuaCodeStyle并安裝。
本地安裝
如果因?yàn)榫W(wǎng)絡(luò)問(wèn)題無(wú)法在線安裝,還可以選擇本地安裝。首先下載插件包到本地磁盤: https://downloads.marketplace.jetbrains.com/files/9768/517613/IntelliJ-EmmyLua-1.4.13-IDEA241.zip?updateId=517613&pluginId=9768&family=INTELLIJ
https://downloads.marketplace.jetbrains.com/files/21973/506115/EmmyLua-CodeStyle-1.5.0.25-IDEA223.zip?updateId=506115&pluginId=21973&family=INTELLIJ
然后選擇從本地安裝,并導(dǎo)入下載的插件包。安裝完成后,就可以新建Lua類型的項(xiàng)目了。創(chuàng)建了Lua項(xiàng)目后,就可以添加Lua腳本文件了。運(yùn)行前,還需要指定Lua解釋器的路徑,才可以正確編譯執(zhí)行。
2 Lua語(yǔ)法
可以使用Lua在線編譯器方便的嘗試編寫簡(jiǎn)單的Lua程序:https://onecompiler.com/lua
2.1 數(shù)據(jù)類型
Lua是一種動(dòng)態(tài)類型語(yǔ)言,一個(gè)變量可以存儲(chǔ)任何類型的值。
類型取值空(nil)空類型只包含一個(gè)值,即nil。nil表示空,所有沒有賦值的變量或表的字段都是nil布爾(boolean)布爾類型包含true和false兩個(gè)值數(shù)字(number)整數(shù)和浮點(diǎn)數(shù)都使用數(shù)字類型存儲(chǔ),如1、0.2、3.5e20等字符串(string)字符串類型可以存儲(chǔ)字符串,且與Redis的鍵值一樣都是二進(jìn)制安全的。字符串可以使用單引號(hào)或雙引號(hào)表示,兩個(gè)符號(hào)是相同的。例如’a’,"b"都是可以的。字符串中可以包含轉(zhuǎn)義字符,如\n、\r等表(table)表類型是Lua語(yǔ)言中唯一的數(shù)據(jù)結(jié)構(gòu),既可以當(dāng)數(shù)組又可以當(dāng)字典,十分靈活函數(shù)(function)函數(shù)在Lua中是一等值(first-class value),可以存儲(chǔ)在變量中,也可以作為函數(shù)的參數(shù)或返回結(jié)果
2.2 變量
Lua 的變量分為全局變量和局部變量。
全局變量
全局變量無(wú)須聲明就可以直接使用,默認(rèn)值是nil。如:
a = 1 -- 為全局變量a賦值
print (b) -- 無(wú)須聲明即可使用,默認(rèn)值是nil
a = nil -- 刪除全局變量a的方法是將其賦值為nil。全局變量沒有聲明和未聲明之分,只有非nil和nil的區(qū)別
局部變量
在Redis腳本中不能使用全局變量,只允許使用局部變量以防止腳本之間相互影響。 聲明局部變量的方法為local變量名,就像這樣:
local c -- 聲明一個(gè)局部變量c,默認(rèn)值是nil
local d = 1 -- 聲明一個(gè)局部變量d并賦值為1
local e, f -- 可以同時(shí)聲明多個(gè)局部變量
同樣,聲明一個(gè)存儲(chǔ)函數(shù)的局部變量的方法為:
local say hi = function ()
print 'hi'
end
命名規(guī)范
變量名必須以非數(shù)字開頭只能包含字母、數(shù)字和下畫線區(qū)分大小寫變量名不與Lua的保留關(guān)鍵字相同,保留關(guān)鍵字如下: and break do else elseif end false for function if in local nil not or function repeat return then true until while
局部變量作用域
局部變量的作用域?yàn)閺穆暶鏖_始到所在層的語(yǔ)句塊末尾,例如:
local x = 10
if true then
local x = x + 1
print (x)
do
local x =x + 1
print (x)
end
print (x)
end
print (x)
打印結(jié)果為: 11 12 11 10
– a的值是1,b的值是2
local e, f = 1
2.3 注釋
Lua的注釋有單行和多行兩種。
單行注釋
以 – 開始,到行尾結(jié)束,在上面的代碼已經(jīng)使用過(guò)了,一般習(xí)慣在 – 后面跟上一個(gè)空格。
多行注釋
以 – [[開始,到]]表示,例如:
-- [[
這是一個(gè)多行注釋
]]
2.4 賦值
Lua支持多重賦值,例如:
local a, b = 1, 2 -- a的值是1,b的值是2
local c, d = 1, 2, 3 -- c的值是1,d的值是2,3被舍棄了
local e, f = 1 -- e的值是1,f的值是nil
在執(zhí)行多重賦值時(shí),Lua會(huì)先計(jì)算所有表達(dá)式的值,例如:
local a = {1, 2, 3}
local i = 1
i, a[i] = i + 1, 5
Lua計(jì)算所有表達(dá)式的值后,上面最后一個(gè)賦值語(yǔ)句變?yōu)椋?/p>
i, a[1] = 2, 5
所以賦值后i的值為2,a則為{5,2,3}。
注意 表類型的索引從1開始
使用函數(shù)返回的多個(gè)值進(jìn)行多重賦值:
a, b, c = func1()
2.5 操作符
Lua有以下5類操作符:
數(shù)學(xué)操作符
操作符說(shuō)明+加號(hào)-減號(hào)*乘號(hào)/除號(hào)%取模-取負(fù)^冪運(yùn)算
數(shù)學(xué)操作符的操作數(shù)如果是字符串會(huì)自動(dòng)轉(zhuǎn)換成數(shù)字
print('1' + 1) -- 結(jié)果為2
比較操作符
操作符說(shuō)明==比較兩個(gè)操作數(shù)的類型和值是否都相等~=比較兩個(gè)操作數(shù)的類型和值是否不相等<小于>大于<=小于等于>=大于等于
比較操作符的結(jié)果一定是布爾類型。比較操作符不同于數(shù)學(xué)操作符,不會(huì)對(duì)兩邊的操 作數(shù)進(jìn)行自動(dòng)類型轉(zhuǎn)換。
print (1 == '1') -- false,二者類型不同,不會(huì)進(jìn)行自動(dòng)類型轉(zhuǎn)換
print ({'a'} == {'a'}) -- false,對(duì)于表類型值比較的是二者的引用
如果需要比較字符串和數(shù)字,可以手動(dòng)進(jìn)行類型轉(zhuǎn)換。
print(1 == tonumber('1'))
print('1' == tostring(1))
tonumber()函數(shù)還可以進(jìn)行進(jìn)制轉(zhuǎn)換,例如:
print(tonumber('F',16)) -- 將字符串'F'從十六進(jìn)制轉(zhuǎn)成十進(jìn)制結(jié)果是15
邏輯操作符
操作符說(shuō)明not根據(jù)操作數(shù)true和false相應(yīng)地返回false和trueanda and b中如果a為真則返回b,否則返回aora or b中如果a為假則返回b,否則返回a
只要操作數(shù)不是nil或false,邏輯操作符就認(rèn)為操作數(shù)為真,否則為假。特別需 要注意的是,即使是0或空字符串也被當(dāng)作真。
print(not '') --空字符串為真
print('' and 1) --''為真返回1
print('' or 1) --''為真返回''
print (false and 5) --false為假返回false
print (false or 5) --false為假返回5
print (not 0) --0為真
輸出: false 1
false 5 false
Lua的邏輯操作符支持短路,也就是說(shuō)對(duì)于false and foo(),的數(shù),因?yàn)榈谝粋€(gè)操作數(shù)已經(jīng)決定了無(wú)論foo()函數(shù)返回的結(jié)果是什么,該表達(dá)是false,or操作符與之類似。
連接操作符
操作符說(shuō)明..用來(lái)連接兩個(gè)字符串
print ('hello' .. ' ' .. 'world!') -- 'hello world!'
連接操作符會(huì)自動(dòng)把數(shù)字類型的值轉(zhuǎn)換成字符串類型:
print ('The price is ' .. 25) -- 'The price is 25'
取長(zhǎng)度操作符
操作符說(shuō)明#用來(lái)獲取字符串或表的長(zhǎng)度
例如:
print(#"12345") -- 5
print(#{1, 2, 3, 4, 5}) -- 5
操作符優(yōu)先級(jí)
^
not # -(一元)
* / %
+ -
..
< > <= >= ~= ==
and
or
2.6 if語(yǔ)句
Lua的if語(yǔ)句格式如下:
if conditonal expression then
statement block
elseif condition then
statement block
else
statement block
end
前面提到過(guò)在Lua中只有nil和false才為假,其余值,包括空字符串和0,都被認(rèn)為是真值。這是一個(gè)容易出問(wèn)題的地方,例如Redis的EXISTS 命令的返回值1和0分別表示存在或不存在,所以在條件判斷是要判斷具體的返回值是0或1:
if redis.call ('exists', 'key') == 1 then
exists = true
else
exists = false
end
2.7 循環(huán)語(yǔ)句
Lua 支持while、repeat和for循環(huán)語(yǔ)句。
while
while condition do
statement block
end
repeat
repeat
statement block
until conditonal expression
for
數(shù)值型 for 循環(huán):用于遍歷一個(gè)數(shù)值區(qū)間
for variable = initial value, final value, step length do
statement block
end
泛型 for 循環(huán):用于遍歷表(table)或者其他迭代器函數(shù)(iterator functions)
for variable1, variable2, ..., variablen in iterator do
statement block
end
例如:
local tab = {'a', 'b', 'c', 'd', 'e'}
for i = 1, 5, 1 do
print(tab[i])
end
for k, v in pairs(tab) do
print(k)
print(v)
end
2.8 表類型
表是Lua中唯一的數(shù)據(jù)結(jié)構(gòu),可以理解為關(guān)聯(lián)數(shù)組,任何類型的值(除了空類型)可以作為表的索引。
表的定義方式為:
對(duì)象
people = {} -- 將變量people賦值為一個(gè)空表
people['name'] = 'Bob' -- 將name字段賦值Bob
print (people.name) -- 打印內(nèi)容為'Bob', people.field是people['field']的語(yǔ)法糖
也可以這樣定義
people = {
name = 'Bob',
age = 29,
emails = {'bob@a.com', 'bob@b.com'},
toString = function()
return people.name .. ':' .. people.age .. ':' .. people.emails[1] .. ':' .. people.emails[2]
end
}
print (people.name) -- 打印的內(nèi)容為'Bob'
print(people.emails[1]) -- 打印的內(nèi)容為bob@a.com
print(people.toString()) -- Bob:29:bob@a.com:bob@b.com
數(shù)組
當(dāng)索引為整數(shù)的時(shí)候,表和傳統(tǒng)的數(shù)組一樣,例如:
a = {}
a [1] = 'Bob'
a[2] = 'Jeff'
還可以寫成下面這樣:
a = {'Bob', 'Jeff'}
print (a[1]) -- 打印的內(nèi)容為'Bob'
Lua約定數(shù)組的索引是從1開始,而不是0。
遍歷表
local tab = {
'one',
a = 'A',
'two',
b = 'B',
'three',
c = 'C',
nil,
d = nil,
'four',
e = 'E',
'five'
}
-- ipairs(tab)返回迭代器,從1開始迭代到最后一個(gè)值不為nil的整形索引
for index, value in ipairs(tab) do
print(index .. ':' .. value)
end
輸出,注意four之后的元素并沒有輸出: 1:one 2:two 3:three
-- pair()返回迭代器,迭代所有值不為nil的索引
for index, value in pairs(tab) do
print(index .. ':' .. value)
end
輸出: 1:one 2:two 3:three 5:four 6:five a:A c:C b:B e:E
for i = 1, #tab, 1 do
if tab[i] then
print(i .. ':' .. tab[i])
end
end
輸出: 1:one 2:two 3:three 5:four 6:five
2.9 函數(shù)
函數(shù)的定義為:
function(參數(shù)列表)
函數(shù)體
end
可以將其賦值給一個(gè)局部變量,例如:
local square = function (num)
return num * num
end
即使沒有參數(shù),括號(hào)也不能省略。
Lua還提供了一個(gè)語(yǔ)法糖來(lái)簡(jiǎn)化函數(shù)的定義,例
local function square (num)
return num * num
end
這段代碼會(huì)被轉(zhuǎn)換為:
local square
square = function (num)
return num * num
end
因?yàn)樵谫x值前聲明了局部變量square,所以可以在函數(shù)內(nèi)部引用自身(實(shí)現(xiàn)遞歸)。如果實(shí)參的個(gè)數(shù)小于形參的個(gè)數(shù),則沒有匹配到的形參的值為nil。相應(yīng)地,如果實(shí)參的個(gè)數(shù)大于形參的個(gè)數(shù),則多出的實(shí)參會(huì)被忽略。如果希望捕獲多出的實(shí)參(即實(shí)現(xiàn)可變參數(shù)個(gè)數(shù)),可以讓最后一個(gè)形參為 … 。
例如,希望傳入若干參數(shù)計(jì)算這些數(shù)的平方:
local function square (...)
local argv = {...}
for i = 1, #argv do
argv[i] = argv[i] * argv[i]
end
return table.unpack(argv)
end
a, b, c = square(1, 2, 3)
print (a)
print (b)
print (c)
輸出結(jié)果為: 1 4 9
在Lua中,return和break(用于跳出循環(huán))語(yǔ)句必須是語(yǔ)句塊中的最后一條語(yǔ)句, 簡(jiǎn)單地說(shuō)在這兩條語(yǔ)句后面只能是end、else或until三者之一。如果希望在語(yǔ)句塊的 中間使用這兩條語(yǔ)句的話,可以人為地使用do和end將其包圍。
3 標(biāo)準(zhǔn)庫(kù)
3.1 Base庫(kù)
提供了一些基礎(chǔ)函數(shù)
函數(shù)說(shuō)明tonumber()字符串轉(zhuǎn)換為數(shù)字tostring()其它類型轉(zhuǎn)換為字符串ipairs()獲取表的整形索引迭代器pairs()獲取表的全部索引迭代器
3.2 String庫(kù)
提供了用于字符串操作的函數(shù)
函數(shù)說(shuō)明string.len(string)string.lower(string)string.upper(string)string.sub(string, start [, end])string.sub()函數(shù)可以獲取一個(gè)字符串從索引start升始到end結(jié)束的子字然系引從1開始。索引可以是負(fù)數(shù),-1代表最后一個(gè)元素。end李效如果省略則默認(rèn)是,(即截取到字符串末尾)。
3.3 Table庫(kù)
提供了用于表操作的函數(shù),大部分函數(shù)都需要的表的形式是數(shù)組形式。
函數(shù)說(shuō)明table.concat(table [, sep [, i (, j1]])將數(shù)組轉(zhuǎn)換為字符串。table.concat()函數(shù)與JavaScript中的join()函數(shù)類似,可以將一個(gè)數(shù)組轉(zhuǎn)換成字符串,中間以sep參數(shù)指定的字符串分割,默認(rèn)為空。i和j用來(lái)限制要轉(zhuǎn)換的表元素的索引范圍,默認(rèn)分別是1和表的長(zhǎng)度,不支持負(fù)數(shù)索引。table.insert (table, [pos, ] value)向數(shù)組中插入元素。向指定索引位置pos抽入兀系value,并將后面的元素按順序后移。默認(rèn)poST是數(shù)組長(zhǎng)度加1,即在數(shù)組末尾插入。table.remove(table [, pos])從數(shù)組中彈出一個(gè)元素。從指定的索引刪除一個(gè)元素,并將后面的元素前移,返回刪除的元素值。默認(rèn)pos的值是數(shù)組的長(zhǎng)度,即從數(shù)組末尾彈出一個(gè)元素。
3.4 Math庫(kù)
Math庫(kù)提供了常用的數(shù)學(xué)運(yùn)算函數(shù),如果參數(shù)是字符串,會(huì)自動(dòng)嘗試轉(zhuǎn)換成數(shù)字。
函數(shù)說(shuō)明math.abs (x)獲得數(shù)字的絕對(duì)值math.sin (x)求三角函數(shù)sin 值math.cos (x)求三角函數(shù) cos值math.tan (x)求三角函數(shù) tan值math.ceil (x)進(jìn)一取整,例如1.2取整后是2math.floor (x)向下取整,例如1.8取整后是1math.max (x, … )獲得參數(shù)中的最大值math.min (x, … )獲得參數(shù)中的最小值math.pow(x, y)獲得xy的值math.sqrt (x)獲得x的平方根math.random([m, [, n]])函數(shù)用來(lái)生成一個(gè)隨機(jī)數(shù),根據(jù)參數(shù)不同其返回值范圍也不同:沒有提供參數(shù):返回[0,1)的實(shí)數(shù);只提供了m參數(shù):返回[1,m]的整數(shù);同時(shí)提供了m和n參數(shù):返回 [m, n]的整數(shù)。math.randomseed (x)math.random()函數(shù)生成的隨機(jī)數(shù)是依據(jù)種子(seed)計(jì)算得來(lái)的偽隨機(jī)數(shù),意味著使用同一種子生成的隨機(jī)數(shù)序列是相同的??梢允褂胢ath.randomseed()函數(shù)設(shè)置種子的值。
隨機(jī)數(shù)測(cè)試:
math.randomseed(1)
print('Random seed is: 1')
print(tostring(math.random(1, 100)))
print(tostring(math.random(1, 100)))
print(tostring(math.random(1, 100)))
print(tostring(math.random(1, 100)))
print(tostring(math.random(1, 100)))
math.randomseed(1)
print('Random seed is: 1')
print(tostring(math.random(1, 100)))
print(tostring(math.random(1, 100)))
print(tostring(math.random(1, 100)))
print(tostring(math.random(1, 100)))
print(tostring(math.random(1, 100)))
math.randomseed(2)
print('Random seed is: 2')
print(tostring(math.random(1, 100)))
print(tostring(math.random(1, 100)))
print(tostring(math.random(1, 100)))
print(tostring(math.random(1, 100)))
print(tostring(math.random(1, 100)))
Output:
Random seed is: 1 40 79 80 92 20 Random seed is: 1 40 79 80 92 20 Random seed is: 2 81 9 13 35 43
3.5 Debug庫(kù)
提供了用于調(diào)試的函數(shù)。
debug.getinfo(f, what)
參數(shù)
f:可以給兩種模式,函數(shù)或數(shù)值。第一種則是給函數(shù),獲取給定函數(shù)的信息表。第二種則是給一個(gè)數(shù)字作為 f 的值,表示棧層級(jí):當(dāng)為 0 時(shí)表示當(dāng)前函數(shù)( 即 getinfo 本身), 1 表示調(diào)用 getinfo 的函數(shù)(尾調(diào)用除外,它們不計(jì)入堆棧),以此類推。如果 f 是一個(gè)大于活躍棧層級(jí)的數(shù)字,則 getinfo 返回 nil。 what: 可選項(xiàng),表示要獲取哪些指定的信息。因?yàn)?getinfo 的效率不高,所以為了效率好些,可以只選擇需要的內(nèi)容,如果需要多個(gè)值時(shí),可以將多個(gè)拼湊,例如 nfS 。
what取值獲取的值n選擇 name 和 namewhatf選擇 funcS選擇 source、short_src、what、linedefined 和 lastlinedefinedl選擇 currentlineL選擇 activelinesu選擇 nup、nparams 和 isvararg
獲取的值描述name該字段是該函數(shù)的一個(gè)適當(dāng)?shù)拿Q,例如保存該函數(shù)的全局變量的名稱。(可能沒有值,也可能有多個(gè)名稱)(只有當(dāng) f 為數(shù)值時(shí)才有該值)namewhat該字段用于說(shuō)明 name 字段的含義,可能是 “global”、“l(fā)ocal”、“method”、“field” 或 “”(空字符串)??兆址硎?Lua 語(yǔ)言找不到該函數(shù)的名稱。func該字段是該函數(shù)本身source該字段用于說(shuō)明函數(shù)定義的位置。如果函數(shù)定義在一個(gè)字符串中(通過(guò)調(diào)用 load),那么 source 就是這個(gè)字符串;如果函數(shù)定義在一個(gè)文件中,那么 source 就是使用 @ 作為前綴的文件名short_src該字段是 source 的精簡(jiǎn)版本(最多 60 個(gè)字符),對(duì)于錯(cuò)誤信息十分有用。what該字段用于說(shuō)明函數(shù)的類型。- 如果 foo 是一個(gè)普通的 Lua 函數(shù),則為 “Lua”- 如果是一個(gè) C 函數(shù),則為 “C”- 如果是一個(gè) Lua 語(yǔ)言代碼段的主要部分,則為 “main” 。linedefined該字段是該函數(shù)定義在源代碼中第一行的行號(hào)lastlinedefined該字段是該函數(shù)定義在源代碼中最后一行的行號(hào)currentline表示當(dāng)前該函數(shù)正在執(zhí)行的代碼所在的行 (只有當(dāng) f 為數(shù)值時(shí)才有該值)istailcall返回一個(gè)布爾值,為真表示函數(shù)是被尾調(diào)用所調(diào)起(尾調(diào)用時(shí),函數(shù)真正的調(diào)用者不在棧中)(只有 f 為數(shù)值時(shí)才有該值)activelines該字段是一個(gè)包含該函數(shù)所有活躍行的集合?;钴S行是指除空行和只包含注釋的行外的其它行(該字段的典型用法是用于設(shè)置斷點(diǎn)。大多數(shù)調(diào)試器不允許在活躍行外設(shè)置斷點(diǎn),因?yàn)榉腔钴S行是不可達(dá)的)。nups該字段是該函數(shù)的上值的個(gè)數(shù)nparams該字段是該函數(shù)的參數(shù)個(gè)數(shù)isvararg該字段表明該函數(shù)是否為可變長(zhǎng)函數(shù)
舉例
function testFunction()
print('-----current function:')
local info1 = debug.getinfo(1)
for k, v in pairs(info1) do
print(k, v)
end
print('-----caller:')
local info2 = debug.getinfo(2)
for k, v in pairs(info2) do
print(k, v)
end
end
testFunction()
Output:
-----current function: func function: 0x55ec6c036770 currentline 3 source @Main.lua name testFunction nparams 0 what Lua linedefined 1 isvararg false short_src Main.lua namewhat global nups 1 istailcall false lastlinedefined 12 -----caller: func function: 0x55ec6c036680 currentline 14 source @Main.lua namewhat nparams 0 linedefined 0 isvararg true short_src Main.lua what main nups 1 istailcall false lastlinedefined 0
3.6 cjson 庫(kù)和 cmsgpack庫(kù)
除了標(biāo)準(zhǔn)庫(kù),Redis還通過(guò)cjson庫(kù)和cmsgpack庫(kù)提供了對(duì)JSON和MessagePack的 支持。Redis自動(dòng)加載了這兩個(gè)庫(kù),在腳本中可以分別通過(guò)cjson和cmsgpack這兩個(gè)全局變量來(lái)訪問(wèn)對(duì)應(yīng)的庫(kù)。兩者的用法如下:
local people = {
name = 'Bob',
age = 29
}
-- 使用cjson序列化成字符串:
local json_people_str = cjson.encode (people)
-- 使用cjson將序列化后的字符串還原成表:
local json_people_obj = cjson.decode (people)
print (json_people_obj.name)
-- 使用cmsgpack序列化成字符串:
local msgpack_people_str = cmsgpack.pack(people)
-- 使用cmsgpack將序列化后的字符串還原成表:
local msgpack_people_obj = cmsgpack.unpack(people)
print (msgpack_people_obj.name)
4 安裝擴(kuò)展庫(kù)
安裝Lua庫(kù)可以通過(guò)在包管理軟件LuaRocks中運(yùn)行命令install下載庫(kù)的源碼并進(jìn)行變異構(gòu)建。所有要求環(huán)境中安裝有GCC編譯器,并且本地有安裝有Lua頭文件和鏈接庫(kù)文件。
4.1 安裝LuaRocks
Luarocks是Lua編程語(yǔ)言的軟件包管理器。它提供了一種簡(jiǎn)單的方法來(lái)安裝和管理Lua模塊,這些模塊是Lua代碼的集合,可用于擴(kuò)展Lua的功能。
使用Luarocks,您可以輕松地從中央存儲(chǔ)庫(kù)或本地文件或URL安裝Lua模塊。您還可以管理模塊之間的依賴關(guān)系,因此,如果一個(gè)模塊需要另一個(gè)模塊才能正常工作,Luarocks將自動(dòng)為您安裝所需的模塊。
Luarocks還提供了一種創(chuàng)建和發(fā)布自己的Lua模塊的方法,以便其他人可以輕松地在自己的Lua程序中使用您的代碼。
LuaRocks安裝包和release源碼下載:https://luarocks.github.io/luarocks/releases/ Github代碼倉(cāng)庫(kù):https://github.com/luarocks/luarocks
Windows
首先從官網(wǎng)上下載可執(zhí)行程序包: https://luarocks.github.io/luarocks/releases/luarocks-3.11.1-windows-64.zip
解壓到指定目錄,并將此目錄添加到環(huán)境變量path,例如:D:\00_programming\07_apps\luarocks-3.11.1-windows-64
打開命令行窗口,運(yùn)行命令:
>luarocks --version
luarocks 3.11.1
LuaRocks main command-line interface
Linux
首先從官網(wǎng)上下載可執(zhí)行程序包: https://luarocks.github.io/luarocks/releases/luarocks-3.11.1-linux-x86_64.zip
4.2 安裝鏈接庫(kù)和頭文件
首先從官網(wǎng)上下載鏈接庫(kù)文件: https://jaist.dl.sourceforge.net/project/luabinaries/5.4.2/Tools%20Executable/Dynamic/lua-5.4.2_Win64_bin.zip?viasf=1
然后在Lua解釋器目錄下新建兩個(gè)子目錄: 頭文件目錄:D:\00_programming\07_apps\lua-5.4.2_Win64_bin\include 動(dòng)態(tài)鏈接庫(kù)目錄:D:\00_programming\07_apps\lua-5.4.2_Win64_bin\lib
用壓縮包中的include文件夾覆蓋剛剛新建的include文件夾: D:\00_programming\07_apps\lua-5.4.2_Win64_bin\include\lauxlib.h D:\00_programming\07_apps\lua-5.4.2_Win64_bin\include\lua.h D:\00_programming\07_apps\lua-5.4.2_Win64_bin\include\lua.hpp D:\00_programming\07_apps\lua-5.4.2_Win64_bin\include\luaconf.h D:\00_programming\07_apps\lua-5.4.2_Win64_bin\include\lualib.h
將壓縮包中的鏈接文件復(fù)制到lib目錄下: D:\00_programming\07_apps\lua-5.4.2_Win64_bin\lib\liblua54.a D:\00_programming\07_apps\lua-5.4.2_Win64_bin\lib\lua54.dll
4.3 配置LuaRocks
將上一步安裝的Lua鏈接庫(kù)文件和頭文件所在目錄,指定到LuaRocks中:
luarocks config variables.LUA_LIBDIR D:\00_programming\07_apps\lua-5.4.2_Win64_bin\lib
luarocks config variables.LUA_INCDIR D:\00_programming\07_apps\lua-5.4.2_Win64_bin\include
4.4 安裝GCC編譯器
首先從官網(wǎng)上下GCC編譯器: https://sourceforge.net/projects/mingw-w64/files/Toolchains%20targetting%20Win64/Personal%20Builds/mingw-builds/8.1.0/threads-win32/seh/x86_64-8.1.0-release-win32-seh-rt_v6-rev0.7z
解壓到指定目錄,例如: D:\00_programming\07_apps\mingw64 并將此目錄下的bin目錄添加到環(huán)境變量path,例如: D:\00_programming\07_apps\mingw64\bin
打開命令行窗口,運(yùn)行命令:
>gcc -v
Using built-in specs.
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=D:/00_programming/07_apps/mingw64/bin/../libexec/gcc/x86_64-w64-mingw32/8.1.0/lto-wrapper.exe
Target: x86_64-w64-mingw32
Configured with: ../../../src/gcc-8.1.0/configure --host=x86_64-w64-mingw32 --build=x86_64-w64-mingw32 --target=x86_64-w64-mingw32 --prefix=/mingw64 --with-sysroot=/c/mingw810/x86_64-810-win32-sjlj-rt_v6-rev0/mingw64 --enable-shared --enable-static --enable-targets=all --enable-multilib --enable-languages=c,c++,fortran,lto --enable-libstdcxx-time=yes --enable-threads=win32 --enable-libgomp --enable-libatomic --enable-lto --enable-graphite --enable-checking=release --enable-fully-dynamic-string --enable-version-specific-runtime-libs --enable-sjlj-exceptions --disable-libstdcxx-pch --disable-libstdcxx-debug --enable-bootstrap --disable-rpath --disable-win32-registry --disable-nls --disable-werror --disable-symvers --with-gnu-as --with-gnu-ld --with-arch-32=i686 --with-arch-64=nocona --with-tune-32=generic --with-tune-64=core2 --with-libiconv --with-system-zlib --with-gmp=/c/mingw810/prerequisites/x86_64-w64-mingw32-static --with-mpfr=/c/mingw810/prerequisites/x86_64-w64-mingw32-static --with-mpc=/c/mingw810/prerequisites/x86_64-w64-mingw32-static --with-isl=/c/mingw810/prerequisites/x86_64-w64-mingw32-static --with-pkgversion='x86_64-win32-sjlj-rev0, Built by MinGW-W64 project' --with-bugurl=https://sourceforge.net/projects/mingw-w64 CFLAGS='-O2 -pipe -fno-ident -I/c/mingw810/x86_64-810-win32-sjlj-rt_v6-rev0/mingw64/opt/include -I/c/mingw810/prerequisites/x86_64-zlib-static/include -I/c/mingw810/prerequisites/x86_64-w64-mingw32-static/include' CXXFLAGS='-O2 -pipe -fno-ident -I/c/mingw810/x86_64-810-win32-sjlj-rt_v6-rev0/mingw64/opt/include -I/c/mingw810/prerequisites/x86_64-zlib-static/include -I/c/mingw810/prerequisites/x86_64-w64-mingw32-static/include' CPPFLAGS=' -I/c/mingw810/x86_64-810-win32-sjlj-rt_v6-rev0/mingw64/opt/include -I/c/mingw810/prerequisites/x86_64-zlib-static/include -I/c/mingw810/prerequisites/x86_64-w64-mingw32-static/include' LDFLAGS='-pipe -fno-ident -L/c/mingw810/x86_64-810-win32-sjlj-rt_v6-rev0/mingw64/opt/lib -L/c/mingw810/prerequisites/x86_64-zlib-static/lib -L/c/mingw810/prerequisites/x86_64-w64-mingw32-static/lib '
Thread model: win32
gcc version 8.1.0 (x86_64-win32-sjlj-rev0, Built by MinGW-W64 project)
4.5 安裝CJson庫(kù)
LuaRocks配置好了,下面我們使用它來(lái)安裝前面用到過(guò)的庫(kù)CJson。打開命令行,運(yùn)行命令:
>luarocks install lua-cjson
Installing https://luarocks.org/lua-cjson-2.1.0.10-1.src.rock
lua-cjson 2.1.0.10-1 is already installed in C:\Users\qp188\AppData\Roaming\luarocks
Use --force to reinstall.
C:\Users\qp188>luarocks install lua-cjson --force
Installing https://luarocks.org/lua-cjson-2.1.0.10-1.src.rock
lua-cjson 2.1.0.10-1 depends on lua >= 5.1 (5.4-1 provided by VM: success)
x86_64-w64-mingw32-gcc -O2 -c -o lua_cjson.o -ID:\00_programming\07_apps\lua-5.4.2_Win64_bin\include lua_cjson.c -DDISABLE_INVALID_NUMBERS -DUSE_INTERNAL_ISINF
x86_64-w64-mingw32-gcc -O2 -c -o strbuf.o -ID:\00_programming\07_apps\lua-5.4.2_Win64_bin\include strbuf.c -DDISABLE_INVALID_NUMBERS -DUSE_INTERNAL_ISINF
strbuf.c: In function 'debug_stats':
strbuf.c:98:17: warning: cast from pointer to integer of different size [-Wpointer-to-int-cast]
(long)s, s->reallocs, s->length, s->size);
^
strbuf.c: In function 'strbuf_resize':
strbuf.c:172:17: warning: cast from pointer to integer of different size [-Wpointer-to-int-cast]
(long)s, s->size, newsize);
^
x86_64-w64-mingw32-gcc -O2 -c -o fpconv.o -ID:\00_programming\07_apps\lua-5.4.2_Win64_bin\include fpconv.c -DDISABLE_INVALID_NUMBERS -DUSE_INTERNAL_ISINF
x86_64-w64-mingw32-gcc -shared -o C:\Users\qp188\AppData\Local\Temp\luarocks_build-lua-cjson-2.1.0.10-1-4032167\cjson.dll lua_cjson.o strbuf.o fpconv.o D:\00_programming\07_apps\lua-5.4.2_Win64_bin\lib\lua54.dll -lm
lua-cjson 2.1.0.10-1 is now installed in C:\Users\qp188\AppData\Roaming\luarocks (license: MIT)
下面來(lái)調(diào)用CJson庫(kù)。在IntelliJ中添加腳本文件cjson-demo.lua:
-- 加載cjson模塊
package.cpath = package.cpath .. ';C:\\Users\\qp188\\AppData\\Roaming\\luarocks\\lib\\lua\\5.4\\cjson.dll'
local cjson = require "cjson"
-- JSON 編碼(將表轉(zhuǎn)換為JSON字符串)
local people = {
name = 'Bob',
age = 29,
emails = {'bob@a.com', 'bob@b.com'}
}
local json_str = cjson.encode(people)
print(json_str)
-- JSON 解碼(將JSON字符串轉(zhuǎn)換為L(zhǎng)ua表)
local bob = cjson.decode(json_str)
print(bob.name .. '-' .. bob.age .. '-' .. bob.emails[1] .. '-' .. bob.emails[2])
運(yùn)行結(jié)果如下:
{"age":29,"emails":["bob@a.com","bob@b.com"],"name":"Bob"}
Bob-29.0-bob@a.com-bob@b.com
4.6 安裝cmsgpack庫(kù)
接下來(lái)安裝cmsgpack庫(kù),打開命令行,運(yùn)行命令:
>luarocks install lua-cmsgpack --force
Installing https://luarocks.org/lua-cmsgpack-0.4.0-0.rockspec
Cloning into 'lua-cmsgpack'...
remote: Enumerating objects: 257, done.
Receiving objects: 100% (257/257), 99.66 KiB | 689.00 KiB/s, done.
Resolving deltas: 100% (129/129), done.
Note: switching to 'dec1810a70d2948725f2e32cc38163de62b9d9a7'.
You are in 'detached HEAD' state. You can look around, make experimental
changes and commit them, and you can discard any commits you make in this
state without impacting any branches by switching back to a branch.
If you want to create a new branch to retain commits you create, you may
do so (now or later) by using -c with the switch command. Example:
git switch -c
Or undo this operation with:
git switch -
Turn off this advice by setting config variable advice.detachedHead to false
Updating files: 100% (12/12), done.
lua-cmsgpack 0.4.0-0 depends on lua >= 5.1 (5.4-1 provided by VM: success)
x86_64-w64-mingw32-gcc -O2 -c -o lua_cmsgpack.o -ID:\00_programming\07_apps\lua-5.4.2_Win64_bin\include lua_cmsgpack.c
x86_64-w64-mingw32-gcc -shared -o C:\Users\qp188\AppData\Local\Temp\luarocks_build-lua-cmsgpack-0.4.0-0-8168657\cmsgpack.dll lua_cmsgpack.o D:\00_programming\07_apps\lua-5.4.2_Win64_bin\lib\lua54.dll -lm
lua-cmsgpack 0.4.0-0 is now installed in C:\Users\qp188\AppData\Roaming\luarocks (license: Two-clause BSD)
接下來(lái)調(diào)用cmsgpack庫(kù)。在IntelliJ中添加腳本文件cmsgpack-demo.lua:
package.cpath = package.cpath .. ';C:\\Users\\qp188\\AppData\\Roaming\\luarocks\\lib\\lua\\5.4\\cmsgpack.dll'
local cmsgpack = require("cmsgpack")
-- 將表轉(zhuǎn)換為字符串
local people = {
name = 'Bob',
age = 29,
emails = {'bob@a.com', 'bob@b.com'}
}
local msgpack_str = cmsgpack.pack(people)
print(msgpack_str)
-- 將字符串轉(zhuǎn)換為表
local bob = cmsgpack.unpack(msgpack_str)
print(bob.name .. '-' .. bob.age .. '-' .. bob.emails[1] .. '-' .. bob.emails[2])
···
運(yùn)行結(jié)果如下:
```lua
??age?name?Bob?emails??bob@a.com?bob@b.com
Bob-29-bob@a.com-bob@b.com
5 構(gòu)建Lua解釋器
首先從官網(wǎng)下載Lua源碼: https://www.lua.org/ftp/lua-5.4.7.tar.gz
解壓到本地目錄,例如: D:\00_programming\02_source_code\lua-5.4.7
在此目錄下創(chuàng)建批處理文件build.cmd,內(nèi)容如下:
@echo off
setlocal
set lua_build_dir=%cd%
set lua_install_dir=%lua_build_dir%\target
echo.
echo **** Compilation starting ... ****
echo.
mingw32-make PLAT=mingw
echo.
echo **** Completed ****
echo.
echo.
echo **** Starting moving files ... ****
echo.
mkdir %lua_install_dir%
mkdir %lua_install_dir%\doc
mkdir %lua_install_dir%\bin
mkdir %lua_install_dir%\include
copy %lua_build_dir%\src\*.exe %lua_install_dir%\bin\*.*
del %lua_build_dir%\src\*.exe
copy %lua_build_dir%\src\*.dll %lua_install_dir%\bin\*.*
del %lua_build_dir%\src\*.dll
copy %lua_build_dir%\src\liblua.a %lua_install_dir%\bin\*.*
del %lua_build_dir%\src\liblua.a
copy %lua_build_dir%\doc\*.* %lua_install_dir%\doc\*.*
copy %lua_build_dir%\src\luaconf.h %lua_install_dir%\include\*.*
copy %lua_build_dir%\src\lua.h %lua_install_dir%\include\*.*
copy %lua_build_dir%\src\lualib.h %lua_install_dir%\include\*.*
copy %lua_build_dir%\src\lauxlib.h %lua_install_dir%\include\*.*
copy %lua_build_dir%\src\lua.hpp %lua_install_dir%\include\*.*
del %lua_build_dir%\src\*.o
echo.
echo **** Completed ... ****
echo.
%lua_install_dir%\bin\lua.exe -e "print 'Hello world!'"
endlocal
運(yùn)行批處理文件:
>build.cmd
**** Compilation starting ... ****
mingw32-make[1]: Entering directory 'D:/00_programming/02_source_code/lua-5.4.7/src'
mingw32-make "LUA_A=lua54.dll" "LUA_T=lua.exe" \
"AR=gcc -std=gnu99 -shared -o" "RANLIB=strip --strip-unneeded" \
"SYSCFLAGS=-DLUA_BUILD_AS_DLL" "SYSLIBS=" "SYSLDFLAGS=-s" lua.exe
mingw32-make[2]: Entering directory 'D:/00_programming/02_source_code/lua-5.4.7/src'
gcc -std=gnu99 -O2 -Wall -Wextra -DLUA_COMPAT_5_3 -DLUA_BUILD_AS_DLL -c -o lua.o lua.c
gcc -std=gnu99 -O2 -Wall -Wextra -DLUA_COMPAT_5_3 -DLUA_BUILD_AS_DLL -c -o lapi.o lapi.c
gcc -std=gnu99 -O2 -Wall -Wextra -DLUA_COMPAT_5_3 -DLUA_BUILD_AS_DLL -c lcode.c
gcc -std=gnu99 -O2 -Wall -Wextra -DLUA_COMPAT_5_3 -DLUA_BUILD_AS_DLL -c -o lctype.o lctype.c
gcc -std=gnu99 -O2 -Wall -Wextra -DLUA_COMPAT_5_3 -DLUA_BUILD_AS_DLL -c -o ldebug.o ldebug.c
gcc -std=gnu99 -O2 -Wall -Wextra -DLUA_COMPAT_5_3 -DLUA_BUILD_AS_DLL -c -o ldo.o ldo.c
gcc -std=gnu99 -O2 -Wall -Wextra -DLUA_COMPAT_5_3 -DLUA_BUILD_AS_DLL -c -o ldump.o ldump.c
gcc -std=gnu99 -O2 -Wall -Wextra -DLUA_COMPAT_5_3 -DLUA_BUILD_AS_DLL -c -o lfunc.o lfunc.c
gcc -std=gnu99 -O2 -Wall -Wextra -DLUA_COMPAT_5_3 -DLUA_BUILD_AS_DLL -c -o lgc.o lgc.c
gcc -std=gnu99 -O2 -Wall -Wextra -DLUA_COMPAT_5_3 -DLUA_BUILD_AS_DLL -c llex.c
gcc -std=gnu99 -O2 -Wall -Wextra -DLUA_COMPAT_5_3 -DLUA_BUILD_AS_DLL -c -o lmem.o lmem.c
gcc -std=gnu99 -O2 -Wall -Wextra -DLUA_COMPAT_5_3 -DLUA_BUILD_AS_DLL -c -o lobject.o lobject.c
gcc -std=gnu99 -O2 -Wall -Wextra -DLUA_COMPAT_5_3 -DLUA_BUILD_AS_DLL -c -o lopcodes.o lopcodes.c
gcc -std=gnu99 -O2 -Wall -Wextra -DLUA_COMPAT_5_3 -DLUA_BUILD_AS_DLL -c lparser.c
gcc -std=gnu99 -O2 -Wall -Wextra -DLUA_COMPAT_5_3 -DLUA_BUILD_AS_DLL -c -o lstate.o lstate.c
gcc -std=gnu99 -O2 -Wall -Wextra -DLUA_COMPAT_5_3 -DLUA_BUILD_AS_DLL -c -o lstring.o lstring.c
gcc -std=gnu99 -O2 -Wall -Wextra -DLUA_COMPAT_5_3 -DLUA_BUILD_AS_DLL -c -o ltable.o ltable.c
gcc -std=gnu99 -O2 -Wall -Wextra -DLUA_COMPAT_5_3 -DLUA_BUILD_AS_DLL -c -o ltm.o ltm.c
gcc -std=gnu99 -O2 -Wall -Wextra -DLUA_COMPAT_5_3 -DLUA_BUILD_AS_DLL -c -o lundump.o lundump.c
gcc -std=gnu99 -O2 -Wall -Wextra -DLUA_COMPAT_5_3 -DLUA_BUILD_AS_DLL -c -o lvm.o lvm.c
gcc -std=gnu99 -O2 -Wall -Wextra -DLUA_COMPAT_5_3 -DLUA_BUILD_AS_DLL -c -o lzio.o lzio.c
gcc -std=gnu99 -O2 -Wall -Wextra -DLUA_COMPAT_5_3 -DLUA_BUILD_AS_DLL -c -o lauxlib.o lauxlib.c
gcc -std=gnu99 -O2 -Wall -Wextra -DLUA_COMPAT_5_3 -DLUA_BUILD_AS_DLL -c -o lbaselib.o lbaselib.c
gcc -std=gnu99 -O2 -Wall -Wextra -DLUA_COMPAT_5_3 -DLUA_BUILD_AS_DLL -c -o lcorolib.o lcorolib.c
gcc -std=gnu99 -O2 -Wall -Wextra -DLUA_COMPAT_5_3 -DLUA_BUILD_AS_DLL -c -o ldblib.o ldblib.c
gcc -std=gnu99 -O2 -Wall -Wextra -DLUA_COMPAT_5_3 -DLUA_BUILD_AS_DLL -c -o liolib.o liolib.c
gcc -std=gnu99 -O2 -Wall -Wextra -DLUA_COMPAT_5_3 -DLUA_BUILD_AS_DLL -c -o lmathlib.o lmathlib.c
gcc -std=gnu99 -O2 -Wall -Wextra -DLUA_COMPAT_5_3 -DLUA_BUILD_AS_DLL -c -o loadlib.o loadlib.c
gcc -std=gnu99 -O2 -Wall -Wextra -DLUA_COMPAT_5_3 -DLUA_BUILD_AS_DLL -c -o loslib.o loslib.c
gcc -std=gnu99 -O2 -Wall -Wextra -DLUA_COMPAT_5_3 -DLUA_BUILD_AS_DLL -c -o lstrlib.o lstrlib.c
gcc -std=gnu99 -O2 -Wall -Wextra -DLUA_COMPAT_5_3 -DLUA_BUILD_AS_DLL -c -o ltablib.o ltablib.c
gcc -std=gnu99 -O2 -Wall -Wextra -DLUA_COMPAT_5_3 -DLUA_BUILD_AS_DLL -c -o lutf8lib.o lutf8lib.c
gcc -std=gnu99 -O2 -Wall -Wextra -DLUA_COMPAT_5_3 -DLUA_BUILD_AS_DLL -c -o linit.o linit.c
gcc -std=gnu99 -shared -o lua54.dll lapi.o lcode.o lctype.o ldebug.o ldo.o ldump.o lfunc.o lgc.o llex.o lmem.o lobject.o lopcodes.o lparser.o lstate.o lstring.o ltable.o ltm.o lundump.o lvm.o lzio.o lauxlib.o lbaselib.o lcorolib.o ldblib.o liolib.o lmathlib.o loadlib.o loslib.o lstrlib.o ltablib.o lutf8lib.o linit.o
strip --strip-unneeded lua54.dll
gcc -std=gnu99 -o lua.exe -s lua.o lua54.dll -lm
mingw32-make[2]: Leaving directory 'D:/00_programming/02_source_code/lua-5.4.7/src'
mingw32-make "LUAC_T=luac.exe" luac.exe
mingw32-make[2]: Entering directory 'D:/00_programming/02_source_code/lua-5.4.7/src'
gcc -std=gnu99 -O2 -Wall -Wextra -DLUA_COMPAT_5_3 -c -o luac.o luac.c
ar rcu liblua.a lapi.o lcode.o lctype.o ldebug.o ldo.o ldump.o lfunc.o lgc.o llex.o lmem.o lobject.o lopcodes.o lparser.o lstate.o lstring.o ltable.o ltm.o lundump.o lvm.o lzio.o lauxlib.o lbaselib.o lcorolib.o ldblib.o liolib.o lmathlib.o loadlib.o loslib.o lstrlib.o ltablib.o lutf8lib.o linit.o
ranlib liblua.a
gcc -std=gnu99 -o luac.exe luac.o liblua.a -lm
mingw32-make[2]: Leaving directory 'D:/00_programming/02_source_code/lua-5.4.7/src'
mingw32-make[1]: Leaving directory 'D:/00_programming/02_source_code/lua-5.4.7/src'
**** Completed ****
**** Starting moving files ... ****
D:\00_programming\02_source_code\lua-5.4.7\src\lua.exe
D:\00_programming\02_source_code\lua-5.4.7\src\luac.exe
已復(fù)制 2 個(gè)文件。
D:\00_programming\02_source_code\lua-5.4.7\src\lua54.dll
已復(fù)制 1 個(gè)文件。
已復(fù)制 1 個(gè)文件。
D:\00_programming\02_source_code\lua-5.4.7\doc\contents.html
D:\00_programming\02_source_code\lua-5.4.7\doc\index.css
D:\00_programming\02_source_code\lua-5.4.7\doc\logo.gif
D:\00_programming\02_source_code\lua-5.4.7\doc\lua.1
D:\00_programming\02_source_code\lua-5.4.7\doc\lua.css
D:\00_programming\02_source_code\lua-5.4.7\doc\luac.1
D:\00_programming\02_source_code\lua-5.4.7\doc\manual.css
D:\00_programming\02_source_code\lua-5.4.7\doc\manual.html
D:\00_programming\02_source_code\lua-5.4.7\doc\OSIApproved_100X125.png
D:\00_programming\02_source_code\lua-5.4.7\doc\readme.html
已復(fù)制 10 個(gè)文件。
已復(fù)制 1 個(gè)文件。
已復(fù)制 1 個(gè)文件。
已復(fù)制 1 個(gè)文件。
已復(fù)制 1 個(gè)文件。
已復(fù)制 1 個(gè)文件。
**** Completed ... ****
Hello world!
6 構(gòu)建LuaRocks
首先從官網(wǎng)下載LuaRocks源碼: https://luarocks.github.io/luarocks/releases/luarocks-3.11.1-win32.zip
解壓到本地目錄,例如: D:\00_programming\02_source_code\luarocks-3.11.1-win32
在此目錄下運(yùn)行命令:
install.bat /F /LUA D:\00_programming\07_apps\lua-5.4.2_Win64_bin /INC D:\00_programming\07_apps\lua-5.4.2_Win64_bin\include /P ./luarocks-3.11.1-install /SELFCONTAINED /Q
此命令會(huì)在luarocks-3.11.1-install下生成可執(zhí)行程序。
運(yùn)行命令結(jié)果如下:
>install.bat /F /LUA D:\00_programming\07_apps\lua-5.4.2_Win64_bin\lib /INC D:\00_programming\07_apps\lua-5.4.2_Win64_bin\include /P ./luarocks-3.11.1-install /SELFCONTAINED /Q
D:\00_programming\02_source_code\luarocks-3.11.1-win32>rem=rem --[[--lua
LuaRocks 3.11.x installer.
========================
== Checking system... ==
========================
Need admin privileges, now elevating a new process to continue installing...
Now exiting unprivileged installer
D:\00_programming\02_source_code\luarocks-3.11.1-win32>install.bat /F /LUA D:\00_programming\07_apps\lua-5.4.2_Win64_bin\lib /INC D:\00_programming\07_apps\lua-5.4.2_Win64_bin\include /P ./luarocks-3.11.1-install /SELFCONTAINED /Q
D:\00_programming\02_source_code\luarocks-3.11.1-win32>rem=rem --[[--lua
LuaRocks 3.11.x installer.
========================
== Checking system... ==
========================
Need admin privileges, now elevating a new process to continue installing...
Now exiting unprivileged installer
D:\00_programming\02_source_code\luarocks-3.11.1-win32>install.bat /F /LUA D:\00_programming\07_apps\lua-5.4.2_Win64_bin /INC D:\00_programming\07_apps\lua-5.4.2_Win64_bin\include /P ./luarocks-3.11.1-install /SELFCONTAINED /Q
D:\00_programming\02_source_code\luarocks-3.11.1-win32>rem=rem --[[--lua
LuaRocks 3.11.x installer.
========================
== Checking system... ==
========================
Need admin privileges, now elevating a new process to continue installing...
Now exiting unprivileged installer
柚子快報(bào)激活碼778899分享:Lua語(yǔ)言入門
好文鏈接
本文內(nèi)容根據(jù)網(wǎng)絡(luò)資料整理,出于傳遞更多信息之目的,不代表金鑰匙跨境贊同其觀點(diǎn)和立場(chǎng)。
轉(zhuǎn)載請(qǐng)注明,如有侵權(quán),聯(lián)系刪除。