--------------------听说这叫分割线----------------------
以下送给lua初学者
包括lua中 简单的面向对象 简单的字符串处理 简单的数据结构
我也是个初学者 水平有限 大部分
治疗来源于lua.org
以下代码供大家修改
希望大家最终能写出更优秀的插件
红色为 lua中类的使用
代码为lua实现利用堆栈计算 四则表达式
ovs 数值栈 ops符号栈
-- code begin
exp="";
getchpoint=0;
op={["+"]=1,["-"]=1,["*"]=2,["/"]=2};
stack={};
stack.__index=stack;function stack.new()
local x={};
x.data={};
setmetatable(x,stack);
return x;
end;function stack:push(v)
tinsert(self.data,v);
endfunction stack:pop()
r=self.data[getn(self.data)]
tremove(self.data);
if r==nil then
return 0;
else
return r;
end
endfunction stack:top()
r=self.data[getn(self.data)]
if r==nil then
return 0;
else
return r;
end
return r;
endfunction stack:getn()
return getn(self.data);
endfunction getch()
getchpoint=getchpoint+1;
return(strsub(exp,getchpoint,getchpoint));
end
function oplv(opx)
if op[opx]==nil then
return 0;
else
return op[opx];
end
end
function CALC_Command(msg)
--DEFAULT_CHAT_FRAME:AddMessage(msg);
exp=msg.."#";
getchpoint=0;
local ovs=stack.new();
local ops=stack.new();
tmp="";
ops:push("#");
repeat
ch=getch();
if strbyte(ch)>47 and strbyte(ch)<58 then
tmp=tmp..ch;
else
if tmp~="" then
ovs:push(tmp)
tmp="";
end
if(oplv(ch)>oplv(ops:top()) or ch=="(") then
ops:push(ch);
elseif(ch==")" and ops:top()=="(") then
ops:pop();
else
thisop=
ops:pop() if thisop=="+" then
ovs:push(ovs:pop()+ovs:pop().."");
getchpoint=getchpoint-1;
elseif thisop=="-" then
ovs:push(0-ovs:pop()+ovs:pop().."");
getchpoint=getchpoint-1;
elseif thisop=="*" then
ovs:push(ovs:pop()*ovs:pop().."");
getchpoint=getchpoint-1;
elseif thisop=="/" then
ovs:push(1/ovs:pop()*ovs:pop().."");
getchpoint=getchpoint-1;
elseif thisop=="#" then
else
DEFAULT_CHAT_FRAME:AddMessage("遇到未定义运算符\""..ch.."\"计算结果可能错误");
end
end
end
until ops:getn()==0
DEFAULT_CHAT_FRAME:AddMessage(msg.."="..ovs:top());
end
SlashCmdList["CALC"] = CALC_Command;
SLASH_CALC1 = "/??";
SLASH_CALC2 = "/??";
根据 Robin 建议加入小数功能
本作品代码优秀 欢迎 大家参观学习 绝对根数据结构教课书上讲的一模一样