Lua是啥?
Lua 是一种轻量小巧的脚本语言,用标准C语言编写并以源代码形式开放, 其设计目的是为了嵌入应用程序中,从而为应用程序提供灵活的扩展和定制功能。
Lua 特性:
- 轻量级: 它用标准C语言编写并以源代码形式开放,编译后仅仅一百余K,可以很方便的嵌入别的程序里。
- 可扩展: Lua提供了非常易于使用的扩展接口和机制:由宿主语言(通常是C或C )提供这些功能,Lua可以使用它们,就像是本来就内置的功能一样。
- 其它特性:
- 支持面向过程(procedure-oriented)编程和函数式编程(functional programming);
- 自动内存管理;只提供了一种通用类型的表(table),用它可以实现数组,哈希表,集合,对象;
- 语言内置模式匹配;闭包(closure);函数也可以看做一个值;提供多线程(协同进程,并非操作系统所支持的线程)支持;
- 通过闭包和table可以很方便地支持面向对象编程所需要的一些关键机制,比如数据抽象,虚函数,继承和重载等。
Lua LOGO
没空编译买这里的
忘了说改名字
OK了,阿巴阿巴
安装一个IDE
代码语言:javascript复制require("wx")
require("turtle")
local com = require('common')
local nW, nH = 1000, 600
local tHan = {
ID = {"A", "B", "C"},
A = {},
B = {},
C = {},
Set = {
["nDisk"] = 10, -- The amount of disks to get moved
["nWait"] = 0.01, -- The amout of time to wait before a move
["clBase"] = colr(139,069,019), -- Base pylon color
["clDisk"] = colr(000,255,000), -- Disks color
["dW"] = 10, -- The distance between all pylons and window edges X
["dH"] = 20, -- The distance between all pylons and window edges Y
["dP"] = 15, -- The width of one pylon stick or plate
["dL"] = 11, -- Text letter width
["dT"] = 19, -- Pylon name text offset delta
["wT"] = 70, -- Fixed width of the first, top, smallest disk
["wB"] = 0, -- Fixed width of the last, bottom, largest disk
["dD"] = 0, -- The disk size width delta until the bottom disk is reached
["bW"] = 0, -- Pylon base support width
["bH"] = 0, -- Pylon hight
["tS"] = os.clock() -- Start time of the process
}
}
local function newPylon(iD, nW, nH)
return {ID=iD,W=nW,H=nH,M=0,P=0}
end
local function drawState()
local tSet = tHan.Set
local dP = tSet["dP"]
local clDisk = tSet["clDisk"]
for iD = 1, #tHan.ID do
local key = tHan.ID[iD]
local val = tHan[key]
for iK = 1, #val do local dsk = val[iK]
local dX, dY = (val.C-dsk.W/2), (val.Y-iK*(dP dsk.H))
pncl(clDisk); rect(dX,dY,dsk.W,dsk.H)
text(com.getRound(dsk.P,0.001).."%",0,dX 1,dY-1)
end
end
end
local function drawBase()
local dW = tHan.Set["dW"]
local dH = tHan.Set["dH"]
local dP = tHan.Set["dP"]
local dT = tHan.Set["dT"]
local bW = tHan.Set["bW"]
local bH = tHan.Set["bH"]
local tS = tHan.Set["tS"]
local dL = tHan.Set["dL"]
local nM = tHan.Set["nMove"]
local clBase = tHan.Set["clBase"]; wipe()
for iD = 1, #tHan.ID do
local key = tHan.ID[iD]
local val = tHan[key]
local xP = (val.X (bW / 2)) - dP/2
pncl(clBase); rect(xP,dH,dP,bH)
text(tHan.ID[iD],0,xP ((dP-dL)/2),dH-dT)
pncl(clBase); rect(val.X,val.Y,bW,dP)
text("Time: "..tostring(os.clock()-tS).."n".."Move: "..tostring(nM))
end
end
local function doMove(ID, tS, tD)
local nWait = tHan.Set["nWait"]
local nMove = tHan.Set["nMove"] 1
local nD, nS = #tD, #tS
if(nWait and nWait > 0) then wait(nWait) end
tS[nS].M = tS[nS].M 1
tS[nS].P = ((tS[nS].M / nMove) * 100)
tD[nD 1] = tS[nS]; tS[nS] = nil
tHan.Set["nMove"] = nMove
drawBase(); drawState(); updt()
end
local function doHanoj(ID, tS, tD, tT)
if(ID == 1) then doMove(ID, tS, tD) else
doHanoj(ID-1, tS, tT, tD)
doMove(ID, tS, tD)
doHanoj(ID-1, tT, tD, tS)
end
end
local function goHanoj(tH)
local tSet = tHan.Set; tHan.Set["nMove"] = 0
local nD = tHan.Set["nDisk"]
local A,B,C = tH[tH.ID[1]], tH[tH.ID[2]], tH[tH.ID[3]]
tSet["bW"] = ((nW - 4*tSet["dW"]) / 3)
tSet["bH"] = (nH - 2*tSet["dH"])
tSet["wB"] = (tSet["bW"] - 2*tSet["dP"])
tSet["dD"] = (tSet["wB"] - tSet["wT"])/(nD-1)
A[1] = newPylon(1,tSet["wT"],tSet["dP"])
for iD = 2, (nD-1) do
A[iD] = newPylon(iD,(A[iD-1].W tSet["dD"]),tSet["dP"])
end
A[nD] = newPylon(nD,tSet["wB"],tSet["dP"])
com.tableArrReverse(A)
local xB, yB = tSet["dW"], (nH - tSet["dH"] - tSet["dP"])
for iD = 1, #tHan.ID do
local key = tHan.ID[iD]
local val = tHan[key]
val.name, val.X, val.Y = key, xB, yB
val.C = (xB tSet["bW"]/2)
xB = xB tSet["dW"] tSet["bW"]
end
drawBase(); drawState();
doHanoj(nD, A, C, B)
drawBase(); drawState();
end
open("The towers of Hanoj")
size(nW, nH); zero(0, 0)
updt(false) -- disable auto updates
goHanoj(tHan)
wait()
写个小程序:
一个小游戏
我觉得可以先看这个
Lua的几种数据类型
为什么我要突然折腾这个Lua,以前玩ESP8266用过几天这个Lua,昨天研究ML的固件,我发现扩展功能的实现就是Lua的实现。
ML的这个Lua的接口实现。
拥有的接口
api_test这个地方是你添加的新功能在这里测试
事件,这里是各种处理线程
显示的功能模块
关于镜头的功能
实时界面
里面运行的是这个Lua的文件系统
内置的一些语法糖可能不是多好,这个东西可以加强Lua的内置功能
好家伙,这个是尼康自己的OS
这个真好看网页设计的
代码语言:javascript复制https://builds.magiclantern.fm/experiments.html
Lua得脚本系统在这里下载到:
这里
打开就像这样
这个不知道是啥
代码语言:javascript复制https://www.lua.org/
代码语言:javascript复制https://github.com/rjpcomputing/luaforwindows
代码语言:javascript复制https://sourceforge.net/projects/luabinaries/
代码语言:javascript复制https://studio.zerobrane.com/download?not-this-time
代码语言:javascript复制http://www.lua.org/manual/5.4/
Lua实现的官方文档
代码语言:javascript复制https://builds.magiclantern.fm/lua_api/index.html
LUA API doc
代码语言:javascript复制https://keplerproject.github.io/luafilesystem/manual.html
Lua 文件系统
代码语言:javascript复制http://stevedonovan.github.io/Penlight/api/manual/01-introduction.md.html
代码语言:javascript复制https://web.archive.org/web/20080118123839/http://www.canon.com/technology/canon_tech/field.html