初学者,有错误希望指正。
15————————集
--列出在一段源代码中出现的所有标示符
function Set (list)
local set = {}
for _, l in ipairs(list) do set[tonumber()] = true end
--
return set
end
reserved = Set{"while", "end", "function", "local", }
——————————————————————————————————————————————————————————————————————
--扩展的code
#!/usr/local/bin/lua
function list_print(reserve)
for k,v in pairs(reserve) do
print(k)
for m,n in pairs(reserve[k]) do
print(m)
print(n)
end
end
end
function Set(list)
local first={}
--local second={}
--local second={true,0}
for _,v in pairs(list) do
--print(type(v))
--set={[v]=value}
--原先的错误做法,多维表理解不清晰,这样的话会重复覆盖,是得只有最后一个输入,原先想写的是内部标签的赋值,但是这里变成了给set重复赋值
--还是理解不清晰,以至于修改后,变成了下一种错误
--first[v]=second
--又一种错误做法,没想明白,但是只修改表的一个值会全部修改掉
--[[
修改成了下方的first[v]={[1]=true,[2]=0}
原先把second表共享了,所以变成了一个表。多维表的前几个表是共享的,但是最后一层表必须是独立的,因为前几个表只是标签,索引
最后一层表才是真正的赋值
]]
--first[v]={[1]=true,[2]=0}
--以上这句用下面这几句替代,会显得更为清晰
first[v]={}
first[v][1]=true
first[v][2]=0
--list_print(set)
end
return first
end
function count_add(list,word)
local l=list
l[word][2]=l[word][2]+1
return l
end
--[[
--这是之前set错误的验真
reserve={["while"]={true,0}}
reserve={["local"]={true,0}}
--list_print(reserve)
--会只输出local的
]]
--Set{"while","end","function",}
reserve=Set{"while","end","function",}
--reserve={["while"]={[1]=true,[2]=0},["end"]={[1]=true,[2]=0},["function"]={[1]=true,[2]=0},}
--list_print(reserve)
--print(reserve["while"][1])
--reserve=first
manage=true
while(manage) do
--list_print(reserve)
word=io.read()
-- print(type(word))
if (word=="list") then
list_print(reserve)
elseif (word=="out") then
manage=false
-- list_print(reserve)
elseif (reserve[word]) then
--print(word)
print(word.."是标识符")
reserve=count_add(reserve,word)
else
print(word.."不是标识符")
end
-- list_print(reserve)
end
15————————数据文件与持久化
--Entry{....}与Entry({....})等价。以一个表作为唯一参数
--使用name-value对来描述数据:
Entry{
author = "Donald E. Knuth",
title = "Literate Programming",
publisher = "CSLI",
year = 1992
}
Entry{
author = "Jon Bentley",
title = "More Programming Pearls",
publisher = "Addison-Wesley",
year = 1990
}
--使用name-value对描述的情况下,收集作者名的代码写为:
local authors = {} -- a set to collect authors
function Entry (b)
if b.author then authors[b.author] = true end
end
dofile("data")
for name in pairs(authors) do print(name) end