Mock 32 #1 Posted July 20, 2010 (edited) Uma funçao nao mto util mais eu ja tinha feito ela no meu web server. Ela executa um pedaço de lua q ta dentro de uma string: function string:load() for lua in self:gmatch('<%%lua(.-)%%>') do local printed = "" local f,err = loadstring(lua) if not f and err then printed = err elseif f then local r,err = pcall(f) err = err or '' printed = err end self = self:gsub('<%%lua.-%%>',printed,1) end return self end Veja: local str = [[ <%lua math.randomseed(os.time()) %> Olá meu nome é mock e eu sou um urso Esta mensagem foi lida as <%lua return os.date('%H:%M:%S') %> E um numero aleatorio foi gerado: <%lua return math.random(0,1000000) %> E aqui tem um erro: <%lua error('omg') %> E aqui tem otro: <%lua dogas %> FLW]] function string:load() for lua in self:gmatch('<%%lua(.-)%%>') do local printed = "" local f,err = loadstring(lua) if not f and err then printed = err elseif f then local r,err = pcall(f) err = err or '' printed = err end self = self:gsub('<%%lua.-%%>',printed,1) end return self end print(str:load()) E retornou isso: >lua -e "io.stdout:setvbuf 'no'" "lualoada.lua" Olá meu nome é mock e eu sou um urso Esta mensagem foi lida as 00:21:08 E um numero aleatorio foi gerado: 434706 E aqui tem um erro: [string " error('omg') "]:1: omg E aqui tem otro: [string " dogas "]:1: '=' expected near '<eof>' FLW >Exit code: 0 Edited January 23, 2011 by Mickfern Share this post Link to post Share on other sites
Kaotar 5 #2 Posted July 20, 2010 Antes de você me posta aqui você me mostrou no msn então eu sei como é, mas aqui ficou toda bugada por causa do forum. Perdeu todas as tag que verificação tanto de gsub quanto de gmatch, também as do exemplo. Mas é bem legal isso ae, parabéns. Att, Kaotar Share this post Link to post Share on other sites
Mock 32 #3 Posted July 20, 2010 Sim vc me msotro :S pra chamar o lua tem que por < depois % depois lua assim: < %lua sem espaço Share this post Link to post Share on other sites
Kaotar 5 #4 Posted July 20, 2010 O problema é que sumui as patterns do gmatch e gsub também. Eu não pretendo usar, mas não sei se é só pra mim que ficou assim. Att, Kaotar Share this post Link to post Share on other sites
Socket 0 #5 Posted July 20, 2010 (edited) Consegui diminuir 2 linhas, após descobrir à um tempo atrás que o string.gsub, também pode receber uma function como 'rep', e que essa função recebe a captura como parametro. function string:load() function s(lua) local f,err = loadstring(lua) if not f and err then return err elseif f then local r,err = pcall(f) err = err or '' return err end end return self:gsub("<%%lua(.-)%%>", s) end Edited January 23, 2011 by Mickfern Share this post Link to post Share on other sites
Roku 0 #6 Posted July 20, 2010 gostei da função mas poderia me dizer pra q serve pcall e loadstring? Share this post Link to post Share on other sites
Kaotar 5 #7 Posted July 20, 2010 loadstring é como transforma-se a string em uma função e pcall é a chamada para funções... Share this post Link to post Share on other sites
Notorious 1 #8 Posted July 20, 2010 (edited) Haha, muito bom, há um tempos atrás eu fiz uma funcao parecida, bem menos complexa, mas semelhante e muito simples: assert(loadstring(self))() Coloquei mais coisa na época mas a sua ficou muito melhor Edited January 23, 2011 by Mickfern Share this post Link to post Share on other sites
Mock 32 #9 Posted July 21, 2010 @Socket LOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOL disso eu nao sabia PQP BOM SABE Share this post Link to post Share on other sites