此存储库包含一些 Lua 程序示例 和 Lua 的额外代码和工具。
所有文件在此 许可证下分发。
以下是部分 Lua 程序示例。你可以 在线 尝试它们。
-- the first program in every language io.write("Hello world, from ",_VERSION,"!\n")
-- from PiL 1, Chapter 16 Account = {balance = 0} function Account:new (o, name) o = o or {name=name} setmetatable(o, self) self.__index = self return o end function Account:deposit (v) self.balance = self.balance + v end function Account:withdraw (v) if v > self.balance then error("insufficient funds on account "..self.name) end self.balance = self.balance - v end function Account:show (title) print(title or "", self.name, self.balance) end a = Account:new(nil,"demo") a:show("after creation") a:deposit(1000.00) a:show("after deposit") a:withdraw(100.00) a:show("after withdraw") -- this would raise an error --[[ b = Account:new(nil,"DEMO") b:withdraw(100.00) --]]
-- bisection method for solving non-linear equations delta=1e-6 -- tolerance function bisect(f,a,b,fa,fb) local c=(a+b)/2 io.write(n," c=",c," a=",a," b=",b,"\n") if c==a or c==b or math.abs(a-b)<delta then return c,b-a end n=n+1 local fc=f(c) if fa*fc<0 then return bisect(f,a,c,fa,fc) else return bisect(f,c,b,fc,fb) end end -- find root of f in the inverval [a,b]. needs f(a)*f(b)<0 function solve(f,a,b) n=0 local z,e=bisect(f,a,b,f(a),f(b)) io.write(string.format("after %d steps, root is %.17g with error %.1e, f=%.1e\n",n,z,e,f(z))) end -- our function function f(x) return x*x*x-x-1 end -- find zero in [1,2] solve(f,1,2)
-- show all global variables local seen={} function dump(t,i) seen[t]=true local s={} local n=0 for k in pairs(t) do n=n+1 s[n]=k end table.sort(s) for k,v in ipairs(s) do print(i,v) v=t[v] if type(v)=="table" and not seen[v] then dump(v,i.."\t") end end end dump(_G,"")
-- the sieve of Eratosthenes programmed with coroutines -- typical usage: lua -e N=500 sieve.lua | column -- generate all the numbers from 2 to n function gen (n) return coroutine.wrap(function () for i=2,n do coroutine.yield(i) end end) end -- filter the numbers generated by `g', removing multiples of `p' function filter (p, g) return coroutine.wrap(function () for n in g do if n%p ~= 0 then coroutine.yield(n) end end end) end N=N or 500 -- from command line x = gen(N) -- generate primes up to N while 1 do local n = x() -- pick a number until done if n == nil then break end print(n) -- must be a prime number x = filter(n, x) -- now remove its multiples end
上次更新:2024 年 2 月 12 日星期一 18:32:26 UTC