自己写的lua测试

--[[
print("hello world")

function fact(n)
if n == 0 then
return 1
else
return n*fact(n-1)
end
end

print("enter a number:")
a = io.read("*number") --读取一个数
print(fact(a)) -- 调用fact并输出返回值

]]--

------------------------------------------------------

--[[
a = {[0]="1,2,3,4,5,6","adsf","qwer"} ---默认为下标1开始 这里设置为0开始

local i = 0 ---这里从0开始读
while a[i] do
print(a[i])
i = i + 1
end
--]]

------------------------------------------------------

--[[
--b --全局变量不用声明 声明后调用print(b)报错
print(b)
print(c)
b = 10
c = 3.14
print(b)
print(c)
b = nil
c = 0;
print(b)
print(c)
--]]

------------------------------------------------------

--[[
print(type("Hello world")) -->string
print(type(10.4*3)) -->number
print(type(print)) -->function
print(type(type)) -->function
print(type(true)) -->boolean
print(type(nil)) -->nil
print(type(type(X))) -->string 最后一行将永远返回“string” 而无关乎X这个值得内容,这是因为type函数总是返回一个字符串
--]]

------------------------------------------------------
--变量没有预定义的类型 任何变量都可以包含任何类型的值
--[[
print(type(a)) -->nil(a尚未初始化)
a = 10
print(type(a)) -->number
a = "a string!!"
print(type(a)) -->string
a = print --是的,这是合法的! ???把函数返回值赋值给a
a(type(a)) -->function ???
--]]
--请注意最后两行 lua中函数作为“第一类值”来看待的,可以像操作其他值一样来操作一个函数值
------------------------------------------------------

--[[
print(4)
print(0.4)
print(4.57e-3) -->0.00457 ???
print(0.3e12) -->300000000000 ???
print(5e+20) -->5e+020 ???
--]]

------------------------------------------------------
-- lua的字符串s不可变de值(immut value),不能像在C语言中那样直接修改字符串的某个字符
-- 而是应该根据修改要求来创建一个新的字符串
--[[
a = "one string"
b = string.gsub(a, "one", "another") -- 修改字符串的一部分
print(a) -- one string
print(b) -- another string
--]]

------------------------------------------------------
--[[
print("one line\nnext line\n\"in quotes\",'in quotes'")
print("alo\n123\"") -- "" ''单引号与双引号效果一样
print('\97lo \10\04923"') -- \97 ASCII码的‘a’\10是换行 \049是1 ???为什么是049而不是49
--]]

------------------------------------------------------
--字符串遇到算术操作 lua会尝试将字符串转换为数字
--[[
print("10"+1)
print("10 + 1")
print("-5.3e-10" * "2")
--print("hello" + 1) -- 错误
--print('a' + 1) -- 错误
--print('\a' + 1) -- 错误
print('\a + 1') -- +1
--]]

------------------------------------------------------
--[[
print(10 .. 23) --1023
--print(10..23) --错误的使用 2点左右都需要空格
--print(10 ..23) --错误的使用 2点左右都需要空格
print(10 .. .23) --100.23 注意这里是连接 不是加法 这里是10 连接 0.23 结果是100.23
print("10" .. 23) --1023
print(10 == "10") --false 注意 在比较的时候是不会转换的 不要太依赖这个转换
--]]

------------------------------------------------------
-- 如果要将字符串转为数字 用tonumber
--[[
while(true) do
print('请输入有效的数字 计算结果是该数字乘以2') --尽量使用双引号 与C++习惯相同 这里是测试
line = io.read() -- 读取一行
n = tonumber(line) -- 尝试将它转换为一个数字
if n == nil then
print(line .. " is not a valid number") --error(line .. " is not a valid number") --valid翻译 有效 --请输入一个有效的数字 error报错并结束
elseif n == 0 then --如果输入是0就return
return; --分号可做结尾 但语句结尾不一定需要加分号 就是不加分号语法也没问题
elseif n == 9 then --如果输入是9就break
break
else
print(n*2)
end
end
--]]

------------------------------------------------------
-- 如果要将数字转换为字符串 用tostring 或者 将该数字与一个空字符串相连接
--[[
print(tostring(10) == "10") -->true 使用tostring
print(10 .. ""=="10") -->true 把数字与空串连接转为字符串后再与"10"做==操作
--]]

------------------------------------------------------
-- 可以再字符串前面放置操作符"#"来获得该字符串长度
--[[
a = "hello"
print(#a) --> 5
print("good\0bye") --> good ???\0后无输出 为什么\0为字符串结尾? 但字符串长度却是8
print(#"good\0bye") --> 8
--]]

------------------------------------------------------
--[[
a = {} --创建一个table,并将它的引用存储到a value可以存储任何类型 table通过key找到value --key可以是字符如"x" 可以是数字如:10 也可以是字符串"XXX"
k = "x" --给k赋值 字符"x"
a[k]= 10 --新条目,key = "x", value = 10
a[20] = "great" --新条目,key = 20, value = "great"
print(a["x"]) -->10
print(a[k]) -->10 --与上句含义同等

k = 20
print(a[k]) -->"great"
print(a["k"]) -->nil 没有这个key 返回nil打印

k = "XXX"
a[k] = 135 --新条目,key = "XXX", value = 135
print(a["XXX"]) -->135 --a["XXX"]和a["xxx"]是一样 大小写 无关

a["x"] = a["x"] + 1 --递增条目"x"
print(a["x"]) -->11

a[20] = a[20] .. "good" -->greatgood
print(a[20]);

a['xxx'] = a[20] -->greatgood --a["XXX"]之前是135 给a["xxx"]赋值后是greatgood
print(a['xxx'])
]]--

------------------------------------------------------
--a b共同引用一个table
--[[
a={} --创建一个表a
a["x"] = 10 --key = "x" value = 10
b = a --b与a引用了同一个table
print(b["x"]) -->10 --b["x"]就是a["x"]
b["x"] = 20 --b["x"] = 20 就是 a["x"] = 20
print(a["x"]) -->20
print(a) -->table: 0060BCD8 --??? 0060BCD8内存首地址码
print(b) -->table: 0060BCD8
a = nil --现在只有b还在引用table
print(a) -->nil
b = nil --再也没有对table的引用
--当一个程序再也没有对一个table的引用时,Lua的垃圾收集器(garbage collector)最终会删除该table,并复用它的内存(???这里是指回收做其它用途吗)
--]]

------------------------------------------------------
--table的循环赋值 \ 设空删除 \ 语法糖
--[[
a = {} --空的table
for i = 1,1000 do --创建1000个新条目
a[i] = i*2
end
print(a[9]) -->18
a["x"] = 10
print(a["x"]) -->10
print(a["y"]) -->nil
a[9] = nil --将a[9]设为空 删除该值
for i = 1,15 do
print(a[i])
--print("\n") --无需这句 print输入完一行后 自带回车
end
print("------------------------")
a.x = 10 --等同于a["x"] = 10 --这种用法成为语法糖(syntactic sugar)
print(a.x) --等同于print(a["x"])
print(a.y) --等同于print(a["y"])
--虽然a["x"]与a.x是等价的 但暗示了不同的意图 a.x将table作为一条记录来使用,每条记录都有一组固定的,预定的key.
--而字符串的写法可能暗示了该table会以任何字符串作为key,而现在处于某些原因需要访问某个特定的key
--]]

------------------------------------------------------
--a.x等价于a["x"] 请勿与a[x]混淆 ---a.x等价于a["x"]表示以"x"为key值找value ---a[x]是以变量x的值作为key来找value
--[[
a = {}
x = "y"
a[x] = 10
print(a[x]) -->10
print(a.x) -->nil --等价于a["x"] table中目前没有key等于"x"
print(a.y) -->10 --等价于a["y"]
--]]

------------------------------------------------------
--table 表示数组 lua通常以1作为索引的起始值
--[[
a = {}
for i = 1,10 do
a[i] = io.read()
end
for i = 0,10 do --a[0] 为 nil
print(a[i])
end
print("------------------------")
print(a[#a]) --输入的最后一个数
a[#a] = nil --删除最后一个数
a[#a+1] = v --将v添加到列表末尾
print(a[#a]) -->v
--]]

------------------------------------------------------
--
--a%b == a-floor(a/b)*b

------------------------------------------------------
--[[取模操作
x = math.pi
print(x) --3.1415926535898
print(x-x%0.01) --3.14
--]]
------------------------------------------------------

------------------------------------------------------
--[[
local tolerance = 10
function isturnback(angle)

end
--]]
------------------------------------------------------
--------------------------------------------------
--[[
local tolerance = 10

function isturnback(angle)
angle = angle%360
return (math.abs(angle - 180) < tolerance)
end

print(isturnback(-180)) -->true
--]]

--------------------------------------------------
--[[nil只与自己相等
print(nil == nil) -->true
print(nil == 0) -->false
print(nil == 1) -->false
--]]

--------------------------------------------------
--[[对于table userdata 和 函数 Lua是做引用比较的 只有当它们引用同一个对象时 才认为他们相等
a = {} a.x = 1 a.y = 0
b = {}; b.x = 1; b.y = 0 --单行多语句可用分号隔开 也可用空格隔开
c = a
print(a==c) -->true
print(a==b) -->false
--]]

--------------------------------------------------
--[[
print("0" == 0) -->false
print(2<15) -->true
print("2"<"15") -->false 这个是判断字符串是否相等
--print(2<"15") -- 报错
--]]

--------------------------------------------------
--[[and第一个为假返回第一个操作数 or第一个为真就返回第一个 所有逻辑操作符把false和nil视为假 其他任何东西视为真
print(4 and 5) -->5 --4为真 所以返回 5
print(nil and 13) -->nil --nil为假 所以返回nil
print(false and 13) -->false--false为假所以返回false
print(4 or 5) -->4 --4为真所以返回真
print(false or 5) -->5 --false为假 所以返回5
--]]

--------------------------------------------------
--[[短路求值 先判断第一个数 and第一个为假不判断第2个 or第第一个为真就不判断第2个
print(2>15 and 2<"15") -->false --2>15为假 直接返回第一个操作数 忽略第2个值的错误
print(2<15 or 2<"15") -->true
--]]

--------------------------------------------------
--[[x = x or v 等价于if not x then x = v end
v = 10
x = x or v
print(x) -->10
if not x then x = v end --当没有设置x就设置x=v为默认值
print(x) -->10
x = nil
x = x or v
print(x) -->10
x = 20
x = x or v
print(x) -->20
x = (x or v) --等价x = x or v --先执行or操作
print(x) -->20
--(x = x) or v --报错 先执行赋值操作报错
--print(x) -->20
--]]

--------------------------------------------------
--[[返回x与y的值的较大者
x = 10
y = 8
max = (x>y) and x or y
print(max) -->10
x = 3
y = 7
max = (x>y) and x or y
print(max) -->7
max = ((x>y) and x) or y --and or优先级是默认从左到右的
print(max) -->7
max = (x>y) and (x or y)
print(max) -->false
--]]

--------------------------------------------------
--[[not用法
print(not nil) -->true
print(not false) -->true
print(not 0) -->false
print(not not nil) -->false
--]]

--------------------------------------------------
--[[..连接符
print("hello" .. "world") -->hello world
print(0 .. 1) -->01
--]]

--------------------------------------------------
--[[连接操作符只会创建一个新的字符串 而不会对其原操作数进行任何修改
a = "hello"
print(a .. "world") -->hello world
print(a) -->hello
--]]

--------------------------------------------------
--[[操作符优先级 用的时候再写测试程序打括号去测试 另外出了^和..是右结合 其余都是左结合
^
not # -(一元)
* / %
+ -
..
< > <= >= ~= ==
and
or
--]]

--------------------------------------------------
--[[table构造式的初始化和遍历
days = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"}

print(days[1])
print("--------------------------------------------------")
for i,v in pairs(days) do
print(days[i])
print("-"..v)
end
print("--------------------------------------------------")
for i=1,#days do
print(days[i])
end
--]]

--------------------------------------------------
--[[2者等价
a = {x = 10, y = 20}
a = {}; a.x = 10; a.y = 20
--]]

--------------------------------------------------
--[[
w = {x = 0,y = 0,label = "console"}
x = {math.sin(0), math.sin(1), math.sin(2)}
w[1] = "another field" --添加key为1 value为another field
x.f = w --添加key为"f" value为w 也就是w[1] 也就是another field
print(w["x"]) -->0
print(w[1]) -->another field
print(x.f[1]) -->another field
print(x[1]) -->0
w.x = nil
print(w.x) -->nil
--]]

--------------------------------------------------
--[[利用table 构成链表结构
list = nil
for line in io.lines("D:1.txt") do -- 读文件操作直到文件的末尾
list = {next = list, value = line} -- 把文件的每个数据加入到链表的value
end

local l = list
while l do --循环遍历输出
print(l.value)
l = l.next
end
--]]

--------------------------------------------------
--[[记录风格的初始化和列表风格的初始化混合在一个构造式中
polyline = {color = "blue", thickness=2, npoints = 4, --key分别是color thickness npoints
{x = 0, y = 0}, -- key = 1
{x = -10, y = 0}, -- key = 2
{x = -10, y = 1}, -- key = 3
{x = 0, y = 1} -- key = 4
}
print(polyline[2].x) -->-10
print(polyline[4].y) -->1
print(polyline["color"]) -->blue
print(polyline["thickness"]) -->2
--]]

--------------------------------------------------
--[[打印ASCII 以后再查
for i = 1,128 do
print("\49") -->1 print("\i")失败 以后再查
end
--]]

--------------------------------------------------
--[[下次再细看
opnames = {["+"] = "add", ["-"] = "sub", ["*"] = "mul", ["/"] = "div"}
i = 20; s = "-"
a = {[i+0] = s, [i+1] = s..s, [i+2] = s..s..s}

print(opnames[s]) -->sub
print(a[22]) -->---
--]]

--------------------------------------------------
--[[特殊情况需要以0做起始索引
days = {[0] = "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"}

print(days[1]) -->Monday
--]]

--------------------------------------------------
--[[这样构造的时候可以在末尾加个逗号 至于有什么好处还不清楚
a = {[1] = "red", [2] = "green", [3] = "blue",}
--]]

--------------------------------------------------
--[[还可以用分号将列表不发与记录部分区分开
a = {x = 10, y = 45; "one", "two", "three"}
--]]

--------------------------------------------------
--[[赋值
t = {n = 3}
a = "hello" .. "world"
t.n = t.n + 1
print(a) -->helloworld
print(t.n) -->4
--]]

--------------------------------------------------
--[[多重赋值
x = 17
a, b = 10, 2*x
print(a) -->10
print(b) -->34
--]]

--------------------------------------------------
--[[
x, y = 15, 9
x, y = y, x
print(x,y) -->9 15 --print里面可以用逗号分隔变量
--]]
--[[
a = {}
a[3] = 12
a[4] = 7
a[3], a[4] = a[4], a[3] --交换表中的数据
print(a[3], a[4])
--]]

--------------------------------------------------
--[[lua总是将等号右边的个数调整到与左边变量的个数相一致 右边多则被丢弃 左边多则多的部分被赋值nil
a, b, c = 0, 1
print(a, b, c) -->0 1 nil
a, b = a+1, b+1, b+2 --b+2被忽略掉
print(a, b) -->1 2
a, b, c = 0 --b和c被赋值空了
print(a, b, c) -->0 nil nil
a, b, c = 0, 0, 0
print(a, b, c) -->0 0 0
--]]

--------------------------------------------------
--[[全局变量 局部变量的使用
j = 10 --全局变量
local i = 1 --局部变量

x = 10
local i = 1

while i <= x do --这个是全局的10
local x = i*2
print(x) -->2 4 6 8 10 12 14 16 18 20 这里是临时变量
i = i+1
end

if i>20 then
local x
x = 20
print(x+2) --不输出 如果输出就是输出22
else
print(x) -->10 --全局变量
end

print(x) -->10 --全局变量
--]]

--------------------------------------------------
--[[do end 控制临时变量作用域
do
local tempA = 15
local tempB = 17
x1 = tempA*2
x2 = tempB*2
end --tempA tempB作用于自此结束
print(x1,x2) -->30 34
print(tempA, tempB) -->nil nil
--]]

--------------------------------------------------
--[[函数篇
print(8*9, 9/8) -->72 1.125
a = math.sin(3)+math.cos(10)
print(os.date()) -->打印系统时间
--]]

-----------------------------------------------
--[[2014年3月6日
--local 临时变量
local a,b = 1,10
if a < b then
print(a) -->1
local a -- 具有隐式的"= nil"
print(a) -->nil
end
print(a, b) -->1 10
--]]

-----------------------------------------------
--[[
foo = 1
if(0 == 0) then
local foo = foo --给临时变量赋值全局变量
print(foo) -->1
foo = 3
print(foo) -->3
end
print(foo) -->1
--]]

-----------------------------------------------
--[[if if else if elseif ... elseif else 的用法
a = -5
if a < 0 then
a = 0
end
print(a) -->0

b=-6
function min()
if a < b then
return a
else
return b
end
end
print(min()) -->b
print(min) -->function: 00BF6750
--]]

-----------------------------------------------
--[[if elseif 用法
a = 1
b = 2
local op = "+"
if op == "+" then
r = a + b
elseif op == "-" then
r = a - b
elseif op == "*" then
r = a * b
elseif op == "/" then
r = a / b
else
error("invalid operation")
end
--]]

-----------------------------------------------
--[[
a = {1,2,3,4,5}
do
local i = 1
while a[i] do
print(a[i])
i = i+1
end
end
--]]

-----------------------------------------------
--[[打印输入第一行不为空的内容
repeat
line = io.read() --输入一行 与C++ do ... while相同
until line ~= ""
print(line)
--]]

-----------------------------------------------
--[[在lua5.1中新加入的功能 声明在循环体中的局部变量的作用域包括了条件测试
x = 6
do
local sqr = x/2
repeat
sqr = (sqr + x/sqr)/2
local error = math.abs(sqr^2 - x)
until error < x/10000 --再次仍可访问error
end
--]]

-----------------------------------------------
--[[函数作为for循环的第2个参数 只会在循环开始前被调用一次
function f(x)
return x*5
end

do
local x = 1 --临时变量作用域到do匹配的end结束
for i = 1,f(x) do --f(x)只会在循环前被调用一次。
print(i) -->1 2 3 4 5
end
end
--]]

-----------------------------------------------
--[[for 循环 递减遍历
for i=10,1,-1 do
print(i) -->10,9,8,7, ... ,1
end
--]]

-----------------------------------------------
--[[循环中i的作用域
for i = 1,10 do
print(i) -->1 2 3 ... 10
end
max = i; --这里i作用域结束了
print(max) -->nil
--]]

-----------------------------------------------
--[[在一个表中查找值
a = {1,2,-5,4,-9}
local found = nil
for i=1, #a do
if(a[i]<0) then
found = a[i]
break
end
end
print(found)
--]]

-----------------------------------------------
--[[创建一个逆向tab 用days的value值做revDays的key值 用days的默认下标索引作为revDays的i
days = {"周一","周二","周三","周四","周五","周六","周日"}

print(days[1]) -->周一

revDays = {}
for k,v in pairs(days) do --k是从1开始的 表的起始默认是1
revDays[v] = k
end

x = "周三"
print(revDays[x]) -->3
--]]

--以上是34页以前的全部代码

--下面的都是有难度的才写
--------------------------------------------------
--[[
function foo()
do
return
end
print("asdfasdfasdfasdfa")
end

foo()
--]]

--------------------------------------------------
--[[
print "hello world"
--]]

--------------------------------------------------
--[[
a = {1,3,5,7,9}
function add(a)
local sum = 0
for i,v in ipairs(a) do
sum = sum + v
end
return sum
end

print(add(a))
--]]

--------------------------------------------------
--[[
function f(a,b)
print(a,b)
return a or b
end

f(3) -- b 为 nil
f(4,5) -- OK
f(6,7,8) -- 8被丢弃
--]]

--------------------------------------------------
--[[
count = 0

function incCount(n)
n = n or 1
count = count + n
return count
end

for i=1,10 do
print(incCount(i))
end

print(incCount())
--]]

--------------------------------------------------
--[[
s, e = string.find("hello world", "world")
print(s,e) -->7 11 --输出从1开始的字符串匹配的起始位置 查找不到匹配串 返回nil nil
--]]

--------------------------------------------------
--[[多重返回值 查找最大数及位置
function maximum(a)
local mi = 1
local m = a[mi]
for i,val in ipairs(a) do
if val > m then
mi = i
m = val
end
end
return m, mi
end

print(maximum({8,10,7,25,9}))
--]]

--------------------------------------------------
---[[函数的多重返回值 书第38页以后再写

--]]

--------------------------------------------------
--[[unpack接受一个数组作为参数 并从下标1开始返回该数组所有元素
print(unpack{10,20,30}) -->10, 20, 30
a, b = unpack{10,20,30}
print(a,b)
--print unpack{10,20,30}
print(unpack({10,20,30})) --unpack加不加圆括号都一样 结果与第一行相同
--]]



--------------------------------------------------
--[[如果想调用任意函数f 而所有的参数都在数组a中 那么可以这么写
f = string.find --copy函数
fnn = f --在copy一次
a = {"hello","llo"}
print(fnn(unpack(a)))
--]]

--------------------------------------------------
--[[unpack是C底层实现的
function unpackSelf(t,i) --递归函数实现unpack
i = i or 1
if t[i] then
return t[i], unpackSelf(t, i+1)
end
end

f = string.find --copy函数
a = {"hello","llo"}
print(f(unpackSelf(a)))
--]]

--------------------------------------------------
--[[
function add(...)
local a,b,c,d,e,f = ...
print(a,b,c,d,e,f) -->1 2 3 4 5 nil
local s = 0
for i, v in ipairs{...} do
s = s+v
end
return s
end

print(add(1,2,3,4,5)) -->15
--]]

--------------------------------------------------
--[[匿名函数极好的便捷性
network = {
{name = "grauna", IP = "201"},
{name = "arraial", IP = "202"},
{name = "lua", IP = "203"},
{name = "derain", IP = "204"},
}

table.sort(network, function (a, b) print(a.name,b.name) return (a.name>b.name) end) --这个函数的用法还是不懂

print(";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;")

for i,v in ipairs(network) do
print(network[i].name,network[i].IP)
end
--]]

--------------------------------------------------
--[[
function f(a, b)
return a.name>b.name
end

a = {name = "grauna", IP = "201"}
b = {name = "arraial", IP = "202"}
print(f(a,b))
--]]

--------------------------------------------------
--[[未写完
function der(f, delta)
delta = delta or 1e-4
return function (x)
return (f(x+delta) - f(x))/delta end
end
--]]

--------------------------------------------------
--[[
name = {"peter", "paul", "mary"}
grades = {mary = 10, paul = 7, peter = 8} --name的value作为grades的key
table.sort(name, function(n1, n2) return grades[n1] > grades[n2] end) --按年级从大到小排序

print(name[1])
print(name[2])
print(name[3])
--]]

--------------------------------------------------
--[[
name = {"peter", "paul", "mary"}
grades = {mary = 10, paul = 7, peter = 8} --name的value作为grades的key
function sortbygrade(names, grades)
table.sort(name, function (n1, n2) return grades[n1] > grades[n2] end) --sort的匿名函数可以访问参数grades,而grades是外部函数sortbygrade的局部变量.在这个匿名函数内部grades既不是全局变量也不是局部变量,将其称为一个"非局部变量"
end

sortbygrade(name, grades)

print(name[1])
print(name[2])
print(name[3])
--]]

--------------------------------------------------
--[[闭合函数 只要还会被调用那么作为返回值的函数以及函数里面的局部变量都不会被销毁
function newCount()
local i = 0
return function () i = i+1 return i end
end

c1 = newCount()
print(c1()) -->1
print(c1()) -->2

c2 = newCount()
print(c2()) -->1
print(c1()) -->3
print(c2()) -->2

c1 = nil
print(c1) -->nil print(c1()) 这样报错 因为c1被清空了 c1的闭合函数也不存在了
print(c2()) -->3 c2的闭合函数还在
--]]

--------------------------------------------------
---[[o.foo(0,x) 等价于o:foo(x) 后面一种方式将o隐含地作为函数的第一个参数

--]]

--------------------------------------------------
--[[利用闭合函数 可以重新定义预定义函数
do
oldstrlen = string.len
do
local q = "789"
string.len =
function(x)
x = x.."qwer"
q = q..x
print(q)
return oldstrlen(q)
end

end
print(string.len("asf")) -->789asfqwer
print(string.len("111")) -->789asfqwer111qwer
end
--]]

--------------------------------------------------
--[[阶乘 lua 递归调用 注意第一句不能写成local fact = function (n) 否则在执行fact(n-1)时 fact未定义
local fact
fact = function (n)
if n == 0 then
return 1
else
return n*fact(n-1)
end
end

for i=1,10 do
print(fact(i))
end
--]]

--------------------------------------------------
--[[local fact = function (n)这样定义会错误 下面定义local function fact(n) 正确
local function fact(n)
if n == 0 then
return 1
else
return n*fact(n-1)
end
end

for i=1,10 do
print(fact(i))
end
--]]

--------------------------------------------------
--[[goo 是 foo的展开版
do
local function foo(a, b)
return a+b
end
end

local goo
goo = function (a, b)
return a-b
end

--print(foo(1,3)) -->错误 因为foo是局部函数
print(goo(2,4)) -->-2
--]]


--6.3 正确的尾调用
--------------------------------------------------
--[[以下代码对g的调用就是一条尾调用
function f(x)
return g(x)
end
--]]

--------------------------------------------------
--[[
function foo(n)
if(n>0) then
return foo(n-1) --正确的尾调用 n传入多大都不会栈溢出 因为尾调用不会耗费栈空间 所有一个程序可以拥有无数嵌套的尾调用 (? 可能这个做8皇后递归应该比C++快 以后有机会测试一下)
--foo(n-1) --错误的尾调用 调用完后foo并不能立即返回 它还需要丢弃g返回的临时结果
--return foo(n-1)+1 --错误的尾调用 必须做一次加法
--return x or foo(n-1) --错误的尾调用 必须调整为一个返回值
--return (foo(n-1)) --错误的尾调用 必须调整为一个返回值
end
end

foo(98989898989898989898989)
--]]

--------------------------------------------------
--[[8皇后测试 网上的代码
local N = 8
-- 判断从第1行开始直到当前给定的行,列是否有冲突的皇后
-- 比如一个解{3, 7, 2, 1, 8, 6, 5, 4}, 在判断第4行,第一列是否合法是, isPlaceOK(a, 4, 1)
-- 我们就发现它是与第三行的2有"斜着"冲突
local function isPlaceOK(a,row,column)
for i = 1, row - 1 do
if(a[i] == column) or --相同列
(a[i] - i == column - row) or --斜着冲突, 方向是\
(a[i] + i == column + row) then --斜着冲突, 方向是/
return false
end
end
return true
end

-- 打印一个解
-- 我们这里的解是放在一个table中,类似{3, 7, 2, 1, 8, 6, 5, 4}
local function printSolution(a)
for i = 1, N do
for j = 1, N do
io.write(a[i] == j and "X" or "-", " ")
end
io.write("\n")
end
io.write("\n")
end

--核心方法,独立解释
local function addQueen(a, row)
if row > N then
printSolution(a)
else
for column = 1, N do
if isPlaceOK(a, row, column) then
a[row] = column
addQueen(a, row + 1)
end
end
end
end



addQueen({}, 1)--从第一行开始求解
--]]

--------------------------------------------------
--[[io.write("X") 输出不了
io.write("X")
--]]

--------------------------------------------------
--[[getmetatable得到元表 setmetatable设置元表
t = {}
print(getmetatable(t)) -->nil

t1 = {}
setmetatable(t, t1)
print(assert(getmetatable(t) == t1)) -->true

print(getmetatable("hi")) -->字符串没有元表 只有table有元表
print(getmetatable(10)) -->数字没有元表 其他类型的元表可在C++中实现
--]]

--------------------------------------------------
--[[这个示例不能运行啊........
Set = {}

--根据参数列表中的值创建一个新的集合
function Set.new(l)
local set = {}
setmetatable(set, mt)
for _, v in ipairs(l) do
set[v] = true
end
return set
end

function Set.union(a, b)
local res = Set.new{}
for k in pairs(a) do
res[k] = true
end
for k in pairs(b) do
res[k] = true
end
return res
end

function Set.intersection(a, b)
local res = Set.new{}
for k in pairs(a) do
res[k] = b[k]
end
return res
end

--为了检测上面的示例,还定义了一个用于打印集合的函数
function Set.tostring(set)
local l = {} --用于存放集合中所有元素的列表
for e in pairs(set) do
l[#l + 1] = e
end
return "{"..table.concat(l,", ").. "}"
end

function Set.print(s)
print(Set.tostring(s))
end

local mt = {} --集合的元表

s1 = Set.new{10, 20, 30, 50}
s2 = Set.new{30, 1}
print(getmetatable(s1)) -->table:
print(getmetatable(s2)) -->table:

--mt.__add = Set.union

s3 = {}
s3 = s1 + s2
--Set.print(s3) -->{1, 10, 20, 30, 50}

mt.__mul = Set.intersection
Set.print((s1 + s2)*s1) -->{10, 20, 30, 50}

s = Set.new(1,2,3)
s = s+8
--]]

--------------------------------------------------
--[[
t = {}

m = { a = " and ", b = "Li Lei", c = "Han Meimei" }
setmetatable(t, { __index = m}) --表{ __index=m }作为表t的元表


for k, v in pairs(m) do --穷举表m
print(k, v) -->a and -->b Li Lei -->c Han Meimei
end
print("-------------")
for k, v in pairs(t) do --穷举表t,无输出
print(k, v) -->nil
end
print("-------------")
print(t.b, t.a, t.c) --> Li Lei and Han Meimei


print("-------------")
print(m.b, m.a, m.c) --> Li Lei and Han Meimei
--]]

--------------------------------------------------
---[[
function add(t1, t2)
--‘#’运算符取表长度
assert(#t1 == #t2)
local length = #t1
for i = 1, length do
t1[i] = t1[i] + t2[i]
end
return t1
end

--setmetatable返回被设置的表
t1 = { 1, 2, 3, 5}
t2 = { 10, 20, 30, 50 }
--t1 = setmetatable(t1, { __add= add })
t2 = setmetatable(t2, {__add = add })

t1 = t1 + t2
for i = 1, #t1 do
print(t1[i])
end

--]]

--------------------------------------------------
---[[

--]]

--------------------------------------------------
---[[

--]]

--------------------------------------------------
---[[

--]]

--------------------------------------------------
---[[

--]]

--------------------------------------------------
---[[

--]]

--------------------------------------------------
---[[

--]]

--------------------------------------------------
---[[

--]]

--------------------------------------------------
---[[

--]]

--------------------------------------------------
---[[

--]]

--------------------------------------------------
---[[

--]]

--------------------------------------------------
---[[

--]]

--------------------------------------------------
---[[

--]]

--------------------------------------------------
---[[

--]]

--------------------------------------------------
---[[

--]]

--------------------------------------------------
---[[

--]]

--------------------------------------------------
---[[

--]]

--------------------------------------------------
---[[

--]]

--------------------------------------------------
---[[

--]]

--------------------------------------------------
---[[

--]]

--------------------------------------------------
---[[

--]]

--------------------------------------------------
---[[

--]]

--------------------------------------------------
---[[

--]]

--------------------------------------------------
---[[

--]]

--------------------------------------------------
---[[

--]]

--------------------------------------------------
---[[

--]]

--------------------------------------------------
---[[

--]]

--------------------------------------------------
---[[

--]]

--------------------------------------------------
---[[

--]]

--------------------------------------------------
---[[

--]]

--------------------------------------------------
---[[

--]]

--------------------------------------------------
---[[

--]]

--------------------------------------------------
---[[

--]]

--------------------------------------------------
---[[

--]]

--------------------------------------------------
---[[

--]]

--------------------------------------------------
---[[

--]]

--------------------------------------------------
---[[

--]]

--------------------------------------------------
---[[

--]]

--------------------------------------------------
---[[

--]]

--------------------------------------------------
---[[

--]]

--------------------------------------------------
---[[

--]]

--------------------------------------------------
---[[

--]]

--------------------------------------------------
---[[

--]]

--------------------------------------------------
---[[

--]]

--------------------------------------------------
---[[

--]]

--------------------------------------------------
---[[

--]]

--------------------------------------------------
---[[

--]]

--------------------------------------------------
---[[

--]]

--------------------------------------------------
---[[

--]]

--------------------------------------------------
---[[

--]]

--------------------------------------------------
---[[

--]]

--------------------------------------------------
---[[

--]]

--------------------------------------------------
---[[

--]]

--------------------------------------------------
---[[

--]]

--------------------------------------------------
---[[

--]]

--------------------------------------------------
---[[

--]]

--------------------------------------------------
---[[

--]]

--------------------------------------------------
---[[

--]]

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Lua实现C测试框架是指在Lua语言中编代码,来测试C语言的功能和性能。下面是一个简单的示例,用于说明如何使用Lua实现C测试框架。 首先,我们需要准备好需要测试的C函数。比如,我们有一个C函数`sum`来计算两个整数的和。 ```c // sum.c int sum(int a, int b) { return a + b; } ``` 接下来,我们可以使用Lua一个测试框架,来测试`sum`函数的功能。 ```lua -- test_sum.lua local sum = require("sum") local function test_sum() -- 测试两个正数的和 assert(sum(3, 5) == 8, "测试失败:3 + 5 不等于 8") -- 测试一个正数和一个负数的和 assert(sum(-2, 5) == 3, "测试失败:-2 + 5 不等于 3") -- 测试两个负数的和 assert(sum(-5, -5) == -10, "测试失败:-5 + -5 不等于 -10") print("所有测试通过!") end test_sum() ``` 在这个测试框架中,我们首先使用`require`函数引入了C代码中的`sum`函数。然后,我们编了一个`test_sum`函数,里面包含了多个测试用例。每个测试用例都使用`assert`函数来断言函数的调用结果是否符合预期。如果断言失败,则会输出相应的错误信息。最后,在`test_sum`函数被调用时,会执行所有的测试用例。 注意,为了在Lua中使用C函数,我们需要通过Lua的C API来调用C函数。具体可以使用Lua的`ffi`库,或者通过自定义的方式将C代码编译成动态链接库,并在Lua中进行调用。 当运行这个测试脚本时,如果所有的断言都通过了,会输出"所有测试通过!"的提示信息。如果有任何断言失败,会输出相应的测试失败信息。这样,我们就可以方便地测试C代码的功能是否正确了。 当然,这只是一个简单的示例,实际上,Lua实现C测试框架要更加复杂。需要根据具体的需求和C函数的特性来进行相应的设计和实现。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值