Jump to content
Sign in to follow this  
Mock

string.load()

Recommended Posts

Mock    32
Mock

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 by Mickfern

Share this post


Link to post
Share on other sites
Kaotar    5
Kaotar

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
Mock

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
Kaotar

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
Socket

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 by Mickfern

Share this post


Link to post
Share on other sites
Roku    0
Roku

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
Kaotar

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
Notorious

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 by Mickfern

Share this post


Link to post
Share on other sites
Mock    32
Mock

@Socket

LOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOL

disso eu nao sabia PQP BOM SABE

Share this post


Link to post
Share on other sites
Guest
This topic is now closed to further replies.
Sign in to follow this  

  • Recently Browsing   0 members

    No registered users viewing this page.

×