Classe em Lua com atributos e método

classic Classic list List threaded Threaded
6 messages Options
Reply | Threaded
Open this post in threaded view
|

Classe em Lua com atributos e método

Michel Braz de Morais
Pessoas...
Estou tentando fazer um comportamento parecido com uma classe no LUA porem sem  sucesso.
Basicamente tenho um vetor (x, y, z) e quero simular como se fosse uma classe assim:

vetor1 = vec3:new()
vetor1.x = 2
vetor1.y = 3
vetor1.z = 4
print(vetor1.x)--ok esta acessando o x , y e z perfeitamente
print(vetor1:mul("param"))--não consigo acessar os métodos 
print(vetor1.mul("param"))--nem assim


No exemplo que havia feito em outro tópico eu não utiliza __index no código c++.
E lá os métodos funcionam perfeitamente. Porem que que a meta-table do lua funciona para os dois casos como descrevi acima.

Segue o código C++ que estou utilizando:


extern "C"
{
#include <lua.h>
#include <lauxlib.h>
#include <lualib.h>
}

struct VEC3
{
float x,y,z;
};
 
static void printStack (lua_State * lua,int n)
{
int top = lua_gettop(lua);
printf( "\n**********************************"
   "\nEstado da pilha na linha %d\n",n);
for (int i = 1, k= top; i <= top; i++, k--)
{
int type = lua_type(lua, i);
printf("\t%d| %8s |%d\n", -k , lua_typename(lua, type), i);
}
printf("**********************************\n\n");
}

static VEC3* getVec3(lua_State * lua, int n)
{
return  *(VEC3** )luaL_checkudata(lua, n, "_luaVEC3");
}

static int onNewVec3Lua(lua_State* lua)
{
VEC3 ** udata = (VEC3 ** )lua_newuserdata(lua, sizeof(VEC3*));
VEC3* vec3 = new VEC3();
vec3->x = 0.0f;
vec3->y = 0.0f;
vec3->z = 0.0f;
*udata = new VEC3();
luaL_getmetatable(lua, "_luaVEC3");
lua_setmetatable(lua, -2);
return 1;
}

static int onMulVec3(lua_State * lua)
{
printStack(lua,__LINE__);
VEC3 * vec3 = getVec3(lua, 1);
const char* param = luaL_checkstring(lua,2);
printf("Param %s",param);
float result = vec3->x * vec3->y * vec3->z;
lua_pushnumber(lua,result);
return 1;
}

static int onDestroyVec3Lua(lua_State * lua)
{
VEC3 * vec3 = getVec3(lua, 1);
delete vec3;
return 0;
}

static int onNewIndexVec3(lua_State * lua)//escrita
{
/*
**********************************
Estado da pilha
-3| userdata |1
-2|   string |2
-1|   number |3
**********************************
*/
VEC3* vec3 =   getVec3(lua,1);
const char* what = luaL_checkstring(lua,2);
switch(what[0])
{
case 'x':
vec3->x = luaL_checknumber(lua,3);
break;
case 'y':
vec3->y = luaL_checknumber(lua,3);
break;
case 'z':
vec3->z = luaL_checknumber(lua,3);
break;
default:
{
printf("__newindex %s inexistente!!!",what);
printStack(lua,__LINE__);
}
}
return 0;
}

static int onIndexVec3(lua_State * lua)//leitura
{
printStack(lua,__LINE__);
/*
**********************************
Estado da pilha
-2| userdata |1
-1|   string |2
**********************************
*/
VEC3* vec3 =   getVec3(lua,1);
const char* what = luaL_checkstring(lua,2);
switch(what[0])
{
case 'x':
lua_pushnumber(lua,vec3->x);
break;
case 'y':
lua_pushnumber(lua,vec3->y);
break;
case 'z':
lua_pushnumber(lua,vec3->z);
break;
default:
{
printf("__index %s inexistente!!!",what);
printStack(lua,__LINE__);
lua_pushnil(lua);
}
}
return 1;
}

static void registerClassVec3(lua_State * lua)
{
luaL_Reg regVec3Methods[] =
{
{       "__gc",         onDestroyVec3Lua},
{       "__index",     onIndexVec3},
{       "__newindex",   onNewIndexVec3},
{       "mul",   onMulVec3},
{       "new",     onNewVec3Lua},
{       NULL,           NULL}
};
luaL_newmetatable(lua, "_luaVEC3");
luaL_setfuncs(lua, regVec3Methods,0);
lua_pushvalue(lua, -1);
lua_setfield(lua, -2, "__self");
lua_setglobal(lua, "vec3");
}

int main()
{
lua_State * lua = luaL_newstate();
luaL_openlibs(lua);
registerClassVec3(lua);
printf("Executando script teste.lua (C++)\n");
int erred = luaL_dofile(lua, "teste.lua");
if (erred)
printf("Lua error: %s\n",luaL_checkstring(lua, -1));
printf("Fim ...(C++)\n");
lua_close(lua);
return 0;
}


Então pessoas...

Já tentei de varias formas mas não consegui que a meta-table funcione acessando as propriedades e seus métodos.
Se alguém puder indicar o caminho eu agradeço



att,

Michel Braz de Morais
Analista / Desenvolvedor de sistemas

--
Lua BR - http://groups.google.com/group/lua-br
---
Você está recebendo esta mensagem porque se inscreveu no grupo "Lua BR" dos Grupos do Google.
Para cancelar a inscrição neste grupo e parar de receber seus e-mails, envie um e-mail para [hidden email].
Para obter mais opções, acesse https://groups.google.com/groups/opt_out.
Reply | Threaded
Open this post in threaded view
|

Re: Classe em Lua com atributos e método

swfly@zipmail.com.br
Olá,
 
Não sei se pode ajudar, mas de qualquer forma olhe o artigo publicado nesta revista http://www.revista-programar.info/?action=editions&type=viewmagazine&n=27. A revista é free.

A*e

SW-Fly





De: Michel Braz de Morais < [hidden email] >
Enviada: Sexta-feira, 27 de Setembro de 2013 09:53
Para: [hidden email]
Assunto: [lua-br] Classe em Lua com atributos e método

Pessoas...
Estou tentando fazer um comportamento parecido com uma classe no LUA porem sem  sucesso.
Basicamente tenho um vetor (x, y, z) e quero simular como se fosse uma classe assim:
 
vetor1 = vec3:new()
vetor1.x = 2
vetor1.y = 3
vetor1.z = 4
print(vetor1.x)--ok esta acessando o x , y e z perfeitamente
print(vetor1:mul("param"))--não consigo acessar os métodos 
print(vetor1.mul("param"))--nem assim
 
 
No exemplo que havia feito em outro tópico eu não utiliza __index no código c++.
E lá os métodos funcionam perfeitamente. Porem que que a meta-table do lua funciona para os dois casos como descrevi acima.
 
Segue o código C++ que estou utilizando:

 
extern "C"
{
#include <lua.h>
#include <lauxlib.h>
#include <lualib.h>
}
 
struct VEC3
{
float x,y,z;
};
 
static void printStack (lua_State * lua,int n)
{
int top = lua_gettop(lua);
printf( "\n**********************************"
   "\nEstado da pilha na linha %d\n",n);
for (int i = 1, k= top; i <= top; i++, k--)
{
int type = lua_type(lua, i);
printf("\t%d| %8s |%d\n", -k , lua_typename(lua, type), i);
}
printf("**********************************\n\n");
}

static VEC3* getVec3(lua_State * lua, int n)
{
return  *(VEC3** )luaL_checkudata(lua, n, "_luaVEC3");
}
 
static int onNewVec3Lua(lua_State* lua)
{
VEC3 ** udata = (VEC3 ** )lua_newuserdata(lua, sizeof(VEC3*));
VEC3* vec3 = new VEC3();
vec3->x=0.0f;
vec3->y=0.0f;
vec3->z=0.0f;
*udata = new VEC3();
luaL_getmetatable(lua, "_luaVEC3");
lua_setmetatable(lua, -2);
return 1;
}
 
static int onMulVec3(lua_State * lua)
{
printStack(lua,__LINE__);
VEC3 * vec3 = getVec3(lua, 1);
const char* param = luaL_checkstring(lua,2);
printf("Param %s",param);
float result = vec3->x * vec3->y * vec3->z;
lua_pushnumber(lua,result);
 
return 1;
}
 
static int onDestroyVec3Lua(lua_State * lua)
{
VEC3 * vec3 = getVec3(lua, 1);
delete vec3;
return 0;
}
 
static int onNewIndexVec3(lua_State * lua)//escrita
{
/*
**********************************
Estado da pilha
-3| userdata |1
-2|   string |2
-1|   number |3
**********************************
*/
VEC3* vec3 =  getVec3(lua,1);
const char* what=luaL_checkstring(lua,2);
switch(what[0])
{
case 'x':
vec3->x =luaL_checknumber(lua,3);
break;
case 'y':
vec3->y =luaL_checknumber(lua,3);
break;
case 'z':
vec3->z =luaL_checknumber(lua,3);
break;
default:
{
printf("__newindex %s inexistente!!!",what);
printStack(lua,__LINE__);
}
}
return 0;
}
 
static int onIndexVec3(lua_State * lua)//leitura
{
printStack(lua,__LINE__);
/*
**********************************
Estado da pilha
-2| userdata |1
-1|   string |2
**********************************
*/
VEC3* vec3 =  getVec3(lua,1);
const char* what = luaL_checkstring(lua,2);
switch(what[0])
{
case 'x':
lua_pushnumber(lua,vec3->x);
break;
case 'y':
lua_pushnumber(lua,vec3->y);
break;
case 'z':
lua_pushnumber(lua,vec3->z);
break;
default:
{
printf("__index %s inexistente!!!",what);
printStack(lua,__LINE__);
lua_pushnil(lua);
}
}
return 1;
}
 
static void registerClassVec3(lua_State * lua)
{
luaL_Reg regVec3Methods[] =
{
{       "__gc",         onDestroyVec3Lua},
{       "__index",    onIndexVec3},
{       "__newindex",  onNewIndexVec3},
{       "mul",  onMulVec3},
{       "new",    onNewVec3Lua},
{       NULL,           NULL}
};
luaL_newmetatable(lua, "_luaVEC3");
luaL_setfuncs(lua, regVec3Methods,0);
 
lua_pushvalue(lua, -1);
lua_setfield(lua, -2, "__self");
 
lua_setglobal(lua, "vec3");
 
}
 
int main()
{
lua_State * lua = luaL_newstate();
luaL_openlibs(lua);
registerClassVec3(lua);
 
printf("Executando script teste.lua (C++)\n");
int erred = luaL_dofile(lua, "teste.lua");
if (erred)
printf("Lua error: %s\n",luaL_checkstring(lua, -1));
printf("Fim ...(C++)\n");
lua_close(lua);
return 0;
}
 
 
Então pessoas...
 
Já tentei de varias formas mas não consegui que a meta-table funcione acessando as propriedades e seus métodos.
Se alguém puder indicar o caminho eu agradeço
 


att,

Michel Braz de Morais
Analista / Desenvolvedor de sistemas

 

--
Lua BR - http://groups.google.com/group/lua-br
---
Você está recebendo esta mensagem porque se inscreveu no grupo "Lua BR" dos Grupos do Google.
Para cancelar a inscrição neste grupo e parar de receber seus e-mails, envie um e-mail para [hidden email].
Para obter mais opções, acesse https://groups.google.com/groups/opt_out.

--
Lua BR - http://groups.google.com/group/lua-br
---
Você está recebendo esta mensagem porque se inscreveu no grupo "Lua BR" dos Grupos do Google.
Para cancelar a inscrição neste grupo e parar de receber seus e-mails, envie um e-mail para [hidden email].
Para obter mais opções, acesse https://groups.google.com/groups/opt_out.
Reply | Threaded
Open this post in threaded view
|

Re: Classe em Lua com atributos e método

Michel Braz de Morais
Valew a dica .... estou no trabalho ainda mas assim que chegar em casa dou uma olhada na revista....
Caso eu consiga eu compartilho a solução com o pessoal aqui

att,

Michel Braz de Morais

Analista / Desenvolvedor de sistemas


Em 27 de setembro de 2013 10:30, <[hidden email]> escreveu:
Olá,
 
Não sei se pode ajudar, mas de qualquer forma olhe o artigo publicado nesta revista http://www.revista-programar.info/?action=editions&type=viewmagazine&n=27. A revista é free.

A*e

SW-Fly





De: Michel Braz de Morais < [hidden email] >
Enviada: Sexta-feira, 27 de Setembro de 2013 09:53
Para: [hidden email]
Assunto: [lua-br] Classe em Lua com atributos e método

Pessoas...
Estou tentando fazer um comportamento parecido com uma classe no LUA porem sem  sucesso.
Basicamente tenho um vetor (x, y, z) e quero simular como se fosse uma classe assim:
 
vetor1 = vec3:new()
vetor1.x = 2
vetor1.y = 3
vetor1.z = 4
print(vetor1.x)--ok esta acessando o x , y e z perfeitamente
print(vetor1:mul("param"))--não consigo acessar os métodos 
print(vetor1.mul("param"))--nem assim
 
 
No exemplo que havia feito em outro tópico eu não utiliza __index no código c++.
E lá os métodos funcionam perfeitamente. Porem que que a meta-table do lua funciona para os dois casos como descrevi acima.
 
Segue o código C++ que estou utilizando:

 
extern "C"
{
#include <lua.h>
#include <lauxlib.h>
#include <lualib.h>
}
 
struct VEC3
{
float x,y,z;
};
 
static void printStack (lua_State * lua,int n)
{
int top = lua_gettop(lua);
printf( "\n**********************************"
   "\nEstado da pilha na linha %d\n",n);
for (int i = 1, k= top; i <= top; i++, k--)
{
int type = lua_type(lua, i);
printf("\t%d| %8s |%d\n", -k , lua_typename(lua, type), i);
}
printf("**********************************\n\n");
}

static VEC3* getVec3(lua_State * lua, int n)
{
return  *(VEC3** )luaL_checkudata(lua, n, "_luaVEC3");
}
 
static int onNewVec3Lua(lua_State* lua)
{
VEC3 ** udata = (VEC3 ** )lua_newuserdata(lua, sizeof(VEC3*));
VEC3* vec3 = new VEC3();
vec3->x=0.0f;
vec3->y=0.0f;
vec3->z=0.0f;
*udata = new VEC3();
luaL_getmetatable(lua, "_luaVEC3");
lua_setmetatable(lua, -2);
return 1;
}
 
static int onMulVec3(lua_State * lua)
{
printStack(lua,__LINE__);
VEC3 * vec3 = getVec3(lua, 1);
const char* param = luaL_checkstring(lua,2);
printf("Param %s",param);
float result = vec3->x * vec3->y * vec3->z;
lua_pushnumber(lua,result);
 
return 1;
}
 
static int onDestroyVec3Lua(lua_State * lua)
{
VEC3 * vec3 = getVec3(lua, 1);
delete vec3;
return 0;
}
 
static int onNewIndexVec3(lua_State * lua)//escrita
{
/*
**********************************
Estado da pilha
-3| userdata |1
-2|   string |2
-1|   number |3
**********************************
*/
VEC3* vec3 =  getVec3(lua,1);
const char* what=luaL_checkstring(lua,2);
switch(what[0])
{
case 'x':
vec3->x =luaL_checknumber(lua,3);
break;
case 'y':
vec3->y =luaL_checknumber(lua,3);
break;
case 'z':
vec3->z =luaL_checknumber(lua,3);
break;
default:
{
printf("__newindex %s inexistente!!!",what);
printStack(lua,__LINE__);
}
}
return 0;
}
 
static int onIndexVec3(lua_State * lua)//leitura
{
printStack(lua,__LINE__);
/*
**********************************
Estado da pilha
-2| userdata |1
-1|   string |2
**********************************
*/
VEC3* vec3 =  getVec3(lua,1);
const char* what = luaL_checkstring(lua,2);
switch(what[0])
{
case 'x':
lua_pushnumber(lua,vec3->x);
break;
case 'y':
lua_pushnumber(lua,vec3->y);
break;
case 'z':
lua_pushnumber(lua,vec3->z);
break;
default:
{
printf("__index %s inexistente!!!",what);
printStack(lua,__LINE__);
lua_pushnil(lua);
}
}
return 1;
}
 
static void registerClassVec3(lua_State * lua)
{
luaL_Reg regVec3Methods[] =
{
{       "__gc",         onDestroyVec3Lua},
{       "__index",    onIndexVec3},
{       "__newindex",  onNewIndexVec3},
{       "mul",  onMulVec3},
{       "new",    onNewVec3Lua},
{       NULL,           NULL}
};
luaL_newmetatable(lua, "_luaVEC3");
luaL_setfuncs(lua, regVec3Methods,0);
 
lua_pushvalue(lua, -1);
lua_setfield(lua, -2, "__self");
 
lua_setglobal(lua, "vec3");
 
}
 
int main()
{
lua_State * lua = luaL_newstate();
luaL_openlibs(lua);
registerClassVec3(lua);
 
printf("Executando script teste.lua (C++)\n");
int erred = luaL_dofile(lua, "teste.lua");
if (erred)
printf("Lua error: %s\n",luaL_checkstring(lua, -1));
printf("Fim ...(C++)\n");
lua_close(lua);
return 0;
}
 
 
Então pessoas...
 
Já tentei de varias formas mas não consegui que a meta-table funcione acessando as propriedades e seus métodos.
Se alguém puder indicar o caminho eu agradeço
 


att,

Michel Braz de Morais
Analista / Desenvolvedor de sistemas

 

--
Lua BR - http://groups.google.com/group/lua-br
---
Você está recebendo esta mensagem porque se inscreveu no grupo "Lua BR" dos Grupos do Google.
Para cancelar a inscrição neste grupo e parar de receber seus e-mails, envie um e-mail para [hidden email].
Para obter mais opções, acesse https://groups.google.com/groups/opt_out.

--
Lua BR - http://groups.google.com/group/lua-br
---
Você está recebendo esta mensagem porque se inscreveu no grupo "Lua BR" dos Grupos do Google.
Para cancelar a inscrição neste grupo e parar de receber seus e-mails, envie um e-mail para [hidden email].
Para obter mais opções, acesse https://groups.google.com/groups/opt_out.

--
Lua BR - http://groups.google.com/group/lua-br
---
Você está recebendo esta mensagem porque se inscreveu no grupo "Lua BR" dos Grupos do Google.
Para cancelar a inscrição neste grupo e parar de receber seus e-mails, envie um e-mail para [hidden email].
Para obter mais opções, acesse https://groups.google.com/groups/opt_out.
Reply | Threaded
Open this post in threaded view
|

Re: Classe em Lua com atributos e método

Michel Braz de Morais
Ninguem ????

att,

Michel Braz de Morais

Analista / Desenvolvedor de sistemas


Em 27 de setembro de 2013 10:50, Michel Braz de Morais <[hidden email]> escreveu:
Valew a dica .... estou no trabalho ainda mas assim que chegar em casa dou uma olhada na revista....
Caso eu consiga eu compartilho a solução com o pessoal aqui

att,

Michel Braz de Morais

Analista / Desenvolvedor de sistemas


Em 27 de setembro de 2013 10:30, <[hidden email]> escreveu:

Olá,
 
Não sei se pode ajudar, mas de qualquer forma olhe o artigo publicado nesta revista http://www.revista-programar.info/?action=editions&type=viewmagazine&n=27. A revista é free.

A*e

SW-Fly





De: Michel Braz de Morais < [hidden email] >
Enviada: Sexta-feira, 27 de Setembro de 2013 09:53
Para: [hidden email]
Assunto: [lua-br] Classe em Lua com atributos e método

Pessoas...
Estou tentando fazer um comportamento parecido com uma classe no LUA porem sem  sucesso.
Basicamente tenho um vetor (x, y, z) e quero simular como se fosse uma classe assim:
 
vetor1 = vec3:new()
vetor1.x = 2
vetor1.y = 3
vetor1.z = 4
print(vetor1.x)--ok esta acessando o x , y e z perfeitamente
print(vetor1:mul("param"))--não consigo acessar os métodos 
print(vetor1.mul("param"))--nem assim
 
 
No exemplo que havia feito em outro tópico eu não utiliza __index no código c++.
E lá os métodos funcionam perfeitamente. Porem que que a meta-table do lua funciona para os dois casos como descrevi acima.
 
Segue o código C++ que estou utilizando:

 
extern "C"
{
#include <lua.h>
#include <lauxlib.h>
#include <lualib.h>
}
 
struct VEC3
{
float x,y,z;
};
 
static void printStack (lua_State * lua,int n)
{
int top = lua_gettop(lua);
printf( "\n**********************************"
   "\nEstado da pilha na linha %d\n",n);
for (int i = 1, k= top; i <= top; i++, k--)
{
int type = lua_type(lua, i);
printf("\t%d| %8s |%d\n", -k , lua_typename(lua, type), i);
}
printf("**********************************\n\n");
}

static VEC3* getVec3(lua_State * lua, int n)
{
return  *(VEC3** )luaL_checkudata(lua, n, "_luaVEC3");
}
 
static int onNewVec3Lua(lua_State* lua)
{
VEC3 ** udata = (VEC3 ** )lua_newuserdata(lua, sizeof(VEC3*));
VEC3* vec3 = new VEC3();
vec3->x=0.0f;
vec3->y=0.0f;
vec3->z=0.0f;
*udata = new VEC3();
luaL_getmetatable(lua, "_luaVEC3");
lua_setmetatable(lua, -2);
return 1;
}
 
static int onMulVec3(lua_State * lua)
{
printStack(lua,__LINE__);
VEC3 * vec3 = getVec3(lua, 1);
const char* param = luaL_checkstring(lua,2);
printf("Param %s",param);
float result = vec3->x * vec3->y * vec3->z;
lua_pushnumber(lua,result);
 
return 1;
}
 
static int onDestroyVec3Lua(lua_State * lua)
{
VEC3 * vec3 = getVec3(lua, 1);
delete vec3;
return 0;
}
 
static int onNewIndexVec3(lua_State * lua)//escrita
{
/*
**********************************
Estado da pilha
-3| userdata |1
-2|   string |2
-1|   number |3
**********************************
*/
VEC3* vec3 =  getVec3(lua,1);
const char* what=luaL_checkstring(lua,2);
switch(what[0])
{
case 'x':
vec3->x =luaL_checknumber(lua,3);
break;
case 'y':
vec3->y =luaL_checknumber(lua,3);
break;
case 'z':
vec3->z =luaL_checknumber(lua,3);
break;
default:
{
printf("__newindex %s inexistente!!!",what);
printStack(lua,__LINE__);
}
}
return 0;
}
 
static int onIndexVec3(lua_State * lua)//leitura
{
printStack(lua,__LINE__);
/*
**********************************
Estado da pilha
-2| userdata |1
-1|   string |2
**********************************
*/
VEC3* vec3 =  getVec3(lua,1);
const char* what = luaL_checkstring(lua,2);
switch(what[0])
{
case 'x':
lua_pushnumber(lua,vec3->x);
break;
case 'y':
lua_pushnumber(lua,vec3->y);
break;
case 'z':
lua_pushnumber(lua,vec3->z);
break;
default:
{
printf("__index %s inexistente!!!",what);
printStack(lua,__LINE__);
lua_pushnil(lua);
}
}
return 1;
}
 
static void registerClassVec3(lua_State * lua)
{
luaL_Reg regVec3Methods[] =
{
{       "__gc",         onDestroyVec3Lua},
{       "__index",    onIndexVec3},
{       "__newindex",  onNewIndexVec3},
{       "mul",  onMulVec3},
{       "new",    onNewVec3Lua},
{       NULL,           NULL}
};
luaL_newmetatable(lua, "_luaVEC3");
luaL_setfuncs(lua, regVec3Methods,0);
 
lua_pushvalue(lua, -1);
lua_setfield(lua, -2, "__self");
 
lua_setglobal(lua, "vec3");
 
}
 
int main()
{
lua_State * lua = luaL_newstate();
luaL_openlibs(lua);
registerClassVec3(lua);
 
printf("Executando script teste.lua (C++)\n");
int erred = luaL_dofile(lua, "teste.lua");
if (erred)
printf("Lua error: %s\n",luaL_checkstring(lua, -1));
printf("Fim ...(C++)\n");
lua_close(lua);
return 0;
}
 
 
Então pessoas...
 
Já tentei de varias formas mas não consegui que a meta-table funcione acessando as propriedades e seus métodos.
Se alguém puder indicar o caminho eu agradeço
 


att,

Michel Braz de Morais
Analista / Desenvolvedor de sistemas

 

--
Lua BR - http://groups.google.com/group/lua-br
---
Você está recebendo esta mensagem porque se inscreveu no grupo "Lua BR" dos Grupos do Google.
Para cancelar a inscrição neste grupo e parar de receber seus e-mails, envie um e-mail para [hidden email].
Para obter mais opções, acesse https://groups.google.com/groups/opt_out.

--
Lua BR - http://groups.google.com/group/lua-br
---
Você está recebendo esta mensagem porque se inscreveu no grupo "Lua BR" dos Grupos do Google.
Para cancelar a inscrição neste grupo e parar de receber seus e-mails, envie um e-mail para [hidden email].
Para obter mais opções, acesse https://groups.google.com/groups/opt_out.


--
Lua BR - http://groups.google.com/group/lua-br
---
Você está recebendo esta mensagem porque se inscreveu no grupo "Lua BR" dos Grupos do Google.
Para cancelar a inscrição neste grupo e parar de receber seus e-mails, envie um e-mail para [hidden email].
Para obter mais opções, acesse https://groups.google.com/groups/opt_out.
Reply | Threaded
Open this post in threaded view
|

Re: Classe em Lua com atributos e método

Eric Chiesse
Só pode ser feito pela C api? Ou melhor só te serve o exemplo com userdata?

Se puder ser código lua direto, e usando uma tabela, fica bem fácil e tem umas jogadas interessantes para fazer.

Ex:

vec3_mt = {}
vec3_mt.__index = vec3_mt

vec3 =
{
    new = function (x, y, z)
        local obj = {x=x, y=y, z=z}
        return setmetatable(obj, vec3_mt)
    end,
}

function vec3_mt.mul(self)
    return self.x * self.y * self.z
end


function vec3_mt.__add(a, b)
    return vec3.new(a.x + b.x, a.y + b.y, a.z + b.z)
end


function vec3_mt.__tostring(self)
    return "(" .. self.x .. ", " .. self.y .. ", " .. self.z ..")"
end


v1 = vec3.new(1,2,3)
print(v1:mul())

v2 = v1 + vec3.new(10,20,30)
print(v2)



---
Eric


Em 30 de setembro de 2013 15:20, Michel Braz de Morais <[hidden email]> escreveu:
Ninguem ????

att,

Michel Braz de Morais

Analista / Desenvolvedor de sistemas


Em 27 de setembro de 2013 10:50, Michel Braz de Morais <[hidden email]> escreveu:

Valew a dica .... estou no trabalho ainda mas assim que chegar em casa dou uma olhada na revista....
Caso eu consiga eu compartilho a solução com o pessoal aqui

att,

Michel Braz de Morais

Analista / Desenvolvedor de sistemas


Em 27 de setembro de 2013 10:30, <[hidden email]> escreveu:

Olá,
 
Não sei se pode ajudar, mas de qualquer forma olhe o artigo publicado nesta revista http://www.revista-programar.info/?action=editions&type=viewmagazine&n=27. A revista é free.

A*e

SW-Fly





De: Michel Braz de Morais < [hidden email] >
Enviada: Sexta-feira, 27 de Setembro de 2013 09:53
Para: [hidden email]
Assunto: [lua-br] Classe em Lua com atributos e método

Pessoas...
Estou tentando fazer um comportamento parecido com uma classe no LUA porem sem  sucesso.
Basicamente tenho um vetor (x, y, z) e quero simular como se fosse uma classe assim:
 
vetor1 = vec3:new()
vetor1.x = 2
vetor1.y = 3
vetor1.z = 4
print(vetor1.x)--ok esta acessando o x , y e z perfeitamente
print(vetor1:mul("param"))--não consigo acessar os métodos 
print(vetor1.mul("param"))--nem assim
 
 
No exemplo que havia feito em outro tópico eu não utiliza __index no código c++.
E lá os métodos funcionam perfeitamente. Porem que que a meta-table do lua funciona para os dois casos como descrevi acima.
 
Segue o código C++ que estou utilizando:

 
extern "C"
{
#include <lua.h>
#include <lauxlib.h>
#include <lualib.h>
}
 
struct VEC3
{
float x,y,z;
};
 
static void printStack (lua_State * lua,int n)
{
int top = lua_gettop(lua);
printf( "\n**********************************"
   "\nEstado da pilha na linha %d\n",n);
for (int i = 1, k= top; i <= top; i++, k--)
{
int type = lua_type(lua, i);
printf("\t%d| %8s |%d\n", -k , lua_typename(lua, type), i);
}
printf("**********************************\n\n");
}

static VEC3* getVec3(lua_State * lua, int n)
{
return  *(VEC3** )luaL_checkudata(lua, n, "_luaVEC3");
}
 
static int onNewVec3Lua(lua_State* lua)
{
VEC3 ** udata = (VEC3 ** )lua_newuserdata(lua, sizeof(VEC3*));
VEC3* vec3 = new VEC3();
vec3->x=0.0f;
vec3->y=0.0f;
vec3->z=0.0f;
*udata = new VEC3();
luaL_getmetatable(lua, "_luaVEC3");
lua_setmetatable(lua, -2);
return 1;
}
 
static int onMulVec3(lua_State * lua)
{
printStack(lua,__LINE__);
VEC3 * vec3 = getVec3(lua, 1);
const char* param = luaL_checkstring(lua,2);
printf("Param %s",param);
float result = vec3->x * vec3->y * vec3->z;
lua_pushnumber(lua,result);
 
return 1;
}
 
static int onDestroyVec3Lua(lua_State * lua)
{
VEC3 * vec3 = getVec3(lua, 1);
delete vec3;
return 0;
}
 
static int onNewIndexVec3(lua_State * lua)//escrita
{
/*
**********************************
Estado da pilha
-3| userdata |1
-2|   string |2
-1|   number |3
**********************************
*/
VEC3* vec3 =  getVec3(lua,1);
const char* what=luaL_checkstring(lua,2);
switch(what[0])
{
case 'x':
vec3->x =luaL_checknumber(lua,3);
break;
case 'y':
vec3->y =luaL_checknumber(lua,3);
break;
case 'z':
vec3->z =luaL_checknumber(lua,3);
break;
default:
{
printf("__newindex %s inexistente!!!",what);
printStack(lua,__LINE__);
}
}
return 0;
}
 
static int onIndexVec3(lua_State * lua)//leitura
{
printStack(lua,__LINE__);
/*
**********************************
Estado da pilha
-2| userdata |1
-1|   string |2
**********************************
*/
VEC3* vec3 =  getVec3(lua,1);
const char* what = luaL_checkstring(lua,2);
switch(what[0])
{
case 'x':
lua_pushnumber(lua,vec3->x);
break;
case 'y':
lua_pushnumber(lua,vec3->y);
break;
case 'z':
lua_pushnumber(lua,vec3->z);
break;
default:
{
printf("__index %s inexistente!!!",what);
printStack(lua,__LINE__);
lua_pushnil(lua);
}
}
return 1;
}
 
static void registerClassVec3(lua_State * lua)
{
luaL_Reg regVec3Methods[] =
{
{       "__gc",         onDestroyVec3Lua},
{       "__index",    onIndexVec3},
{       "__newindex",  onNewIndexVec3},
{       "mul",  onMulVec3},
{       "new",    onNewVec3Lua},
{       NULL,           NULL}
};
luaL_newmetatable(lua, "_luaVEC3");
luaL_setfuncs(lua, regVec3Methods,0);
 
lua_pushvalue(lua, -1);
lua_setfield(lua, -2, "__self");
 
lua_setglobal(lua, "vec3");
 
}
 
int main()
{
lua_State * lua = luaL_newstate();
luaL_openlibs(lua);
registerClassVec3(lua);
 
printf("Executando script teste.lua (C++)\n");
int erred = luaL_dofile(lua, "teste.lua");
if (erred)
printf("Lua error: %s\n",luaL_checkstring(lua, -1));
printf("Fim ...(C++)\n");
lua_close(lua);
return 0;
}
 
 
Então pessoas...
 
Já tentei de varias formas mas não consegui que a meta-table funcione acessando as propriedades e seus métodos.
Se alguém puder indicar o caminho eu agradeço
 


att,

Michel Braz de Morais
Analista / Desenvolvedor de sistemas

 

--
Lua BR - http://groups.google.com/group/lua-br
---
Você está recebendo esta mensagem porque se inscreveu no grupo "Lua BR" dos Grupos do Google.
Para cancelar a inscrição neste grupo e parar de receber seus e-mails, envie um e-mail para [hidden email].
Para obter mais opções, acesse https://groups.google.com/groups/opt_out.

--
Lua BR - http://groups.google.com/group/lua-br
---
Você está recebendo esta mensagem porque se inscreveu no grupo "Lua BR" dos Grupos do Google.
Para cancelar a inscrição neste grupo e parar de receber seus e-mails, envie um e-mail para [hidden email].
Para obter mais opções, acesse https://groups.google.com/groups/opt_out.


--
Lua BR - http://groups.google.com/group/lua-br
---
Você está recebendo esta mensagem porque se inscreveu no grupo "Lua BR" dos Grupos do Google.
Para cancelar a inscrição neste grupo e parar de receber seus e-mails, envie um e-mail para [hidden email].
Para obter mais opções, acesse https://groups.google.com/groups/opt_out.

--
Lua BR - http://groups.google.com/group/lua-br
---
Você está recebendo esta mensagem porque se inscreveu no grupo "Lua BR" dos Grupos do Google.
Para cancelar a inscrição neste grupo e parar de receber seus e-mails, envie um e-mail para [hidden email].
Para obter mais opções, acesse https://groups.google.com/groups/opt_out.
Reply | Threaded
Open this post in threaded view
|

Re: Classe em Lua com atributos e método

Michel Braz de Morais
Obrigado Eric Chiesse e swfly por tentar ajudar.

Fico feliz que haja ao menos uma tentativa de ajudar nas dúvidas de nós miseres programadores.

Caro swfly, a dica da revista programar não ajudou muito pois não ia muito alem do básico em lua.
Mas fiquei impressionado com a qualidade da revista pois contem muitos artigos técnicos relevantes.
Baixei varias edições para tentar encontrar um exemplo e me surpreendi com o conteúdo técnico abrangente. Ficou no meu favoritos aqui.

Caro Eric Chiesse, obrigado pelo empenho no exemplo em lua mas a idéia e utilizando a API em c mesmo pois estou criando um pequeno motor de game em que é necessario ter os valores em c.

A boa noticia é que consegui hoje a tarde fazer o que queria fazer.

Depois de várias e varias leituras (alias recomendo Programming in Lua Third Edition que é o unico livro que achei sobre o lua 5.2), eu pensei em um meio alternativoo para o que eu queria fazer.

Não achei nenhum exemplo mas pensei o seguinte:
E se ao invés de trabalhar com userdata eu trabalhar com table e fixar em um campo da table meu userdata.
Basicamente foi isso que fiz.

Então o código em lua:

vetor1 = vec3.new() --instancia um novo vetor
vetor1.x = 10
vetor1.y = 50
print(string.format("vec3 X: %f  Y: %f Z: %f",vetor1.x,vetor1.y,vetor1.z))

vetor2 = vec3.new(1,2,3)--instancia um novo vetor inicializando x, y, e z
print(string.format("vec2 X: %f  Y: %f Z: %f",vetor2.x,vetor2.y,vetor2.z))
valor_length = vetor2:length() --método no vetor que calcula o cumprimento do mesmo
valor_len = vetor2.len --variavel do vetor (nesse caso somente leitura) que retorna o mesmo que length().
print(string.format("length():%f da no mesmo que len:%f",valor_length,valor_len))

vetor3 = vec3.new(vetor2)--instancia um novo vetor copiando x, y e z do outro vetor
print(string.format("vec3 X: %f  Y: %f Z: %f",vetor3.x,vetor3.y,vetor3.z))


Funciona perfeitamente e produz a seguinte saida:

Executando script teste.lua (C++)
vec3 X: 10.000000  Y: 50.000000 Z: 0.000000
vec2 X: 2.000000  Y: 3.000000 Z: 0.000000
length():3.605551 da no mesmo que len:3.605551
vec3 X: 0.000000  Y: 0.000000 Z: 0.000000


Segue o link deste exemplo que criei:

Exemplo classe C++/lua com metodos e atributos


Nada como compartilhar para evoluirmos jutos!!!

Valew galera abraço....

att,

Michel Braz de Morais

Analista / Desenvolvedor de sistemas


Em 2 de outubro de 2013 22:20, Eric Chiesse <[hidden email]> escreveu:
Só pode ser feito pela C api? Ou melhor só te serve o exemplo com userdata?

Se puder ser código lua direto, e usando uma tabela, fica bem fácil e tem umas jogadas interessantes para fazer.

Ex:

vec3_mt = {}
vec3_mt.__index = vec3_mt

vec3 =
{
    new = function (x, y, z)
        local obj = {x=x, y=y, z=z}
        return setmetatable(obj, vec3_mt)
    end,
}

function vec3_mt.mul(self)
    return self.x * self.y * self.z
end


function vec3_mt.__add(a, b)
    return vec3.new(a.x + b.x, a.y + b.y, a.z + b.z)
end


function vec3_mt.__tostring(self)
    return "(" .. self.x .. ", " .. self.y .. ", " .. self.z ..")"
end


v1 = vec3.new(1,2,3)
print(v1:mul())

v2 = v1 + vec3.new(10,20,30)
print(v2)



---
Eric


Em 30 de setembro de 2013 15:20, Michel Braz de Morais <[hidden email]> escreveu:

Ninguem ????

att,

Michel Braz de Morais

Analista / Desenvolvedor de sistemas


Em 27 de setembro de 2013 10:50, Michel Braz de Morais <[hidden email]> escreveu:

Valew a dica .... estou no trabalho ainda mas assim que chegar em casa dou uma olhada na revista....
Caso eu consiga eu compartilho a solução com o pessoal aqui

att,

Michel Braz de Morais

Analista / Desenvolvedor de sistemas


Em 27 de setembro de 2013 10:30, <[hidden email]> escreveu:

Olá,
 
Não sei se pode ajudar, mas de qualquer forma olhe o artigo publicado nesta revista http://www.revista-programar.info/?action=editions&type=viewmagazine&n=27. A revista é free.

A*e

SW-Fly





De: Michel Braz de Morais < [hidden email] >
Enviada: Sexta-feira, 27 de Setembro de 2013 09:53
Para: [hidden email]
Assunto: [lua-br] Classe em Lua com atributos e método

Pessoas...
Estou tentando fazer um comportamento parecido com uma classe no LUA porem sem  sucesso.
Basicamente tenho um vetor (x, y, z) e quero simular como se fosse uma classe assim:
 
vetor1 = vec3:new()
vetor1.x = 2
vetor1.y = 3
vetor1.z = 4
print(vetor1.x)--ok esta acessando o x , y e z perfeitamente
print(vetor1:mul("param"))--não consigo acessar os métodos 
print(vetor1.mul("param"))--nem assim
 
 
No exemplo que havia feito em outro tópico eu não utiliza __index no código c++.
E lá os métodos funcionam perfeitamente. Porem que que a meta-table do lua funciona para os dois casos como descrevi acima.
 
Segue o código C++ que estou utilizando:

 
extern "C"
{
#include <lua.h>
#include <lauxlib.h>
#include <lualib.h>
}
 
struct VEC3
{
float x,y,z;
};
 
static void printStack (lua_State * lua,int n)
{
int top = lua_gettop(lua);
printf( "\n**********************************"
   "\nEstado da pilha na linha %d\n",n);
for (int i = 1, k= top; i <= top; i++, k--)
{
int type = lua_type(lua, i);
printf("\t%d| %8s |%d\n", -k , lua_typename(lua, type), i);
}
printf("**********************************\n\n");
}

static VEC3* getVec3(lua_State * lua, int n)
{
return  *(VEC3** )luaL_checkudata(lua, n, "_luaVEC3");
}
 
static int onNewVec3Lua(lua_State* lua)
{
VEC3 ** udata = (VEC3 ** )lua_newuserdata(lua, sizeof(VEC3*));
VEC3* vec3 = new VEC3();
vec3->x=0.0f;
vec3->y=0.0f;
vec3->z=0.0f;
*udata = new VEC3();
luaL_getmetatable(lua, "_luaVEC3");
lua_setmetatable(lua, -2);
return 1;
}
 
static int onMulVec3(lua_State * lua)
{
printStack(lua,__LINE__);
VEC3 * vec3 = getVec3(lua, 1);
const char* param = luaL_checkstring(lua,2);
printf("Param %s",param);
float result = vec3->x * vec3->y * vec3->z;
lua_pushnumber(lua,result);
 
return 1;
}
 
static int onDestroyVec3Lua(lua_State * lua)
{
VEC3 * vec3 = getVec3(lua, 1);
delete vec3;
return 0;
}
 
static int onNewIndexVec3(lua_State * lua)//escrita
{
/*
**********************************
Estado da pilha
-3| userdata |1
-2|   string |2
-1|   number |3
**********************************
*/
VEC3* vec3 =  getVec3(lua,1);
const char* what=luaL_checkstring(lua,2);
switch(what[0])
{
case 'x':
vec3->x =luaL_checknumber(lua,3);
break;
case 'y':
vec3->y =luaL_checknumber(lua,3);
break;
case 'z':
vec3->z =luaL_checknumber(lua,3);
break;
default:
{
printf("__newindex %s inexistente!!!",what);
printStack(lua,__LINE__);
}
}
return 0;
}
 
static int onIndexVec3(lua_State * lua)//leitura
{
printStack(lua,__LINE__);
/*
**********************************
Estado da pilha
-2| userdata |1
-1|   string |2
**********************************
*/
VEC3* vec3 =  getVec3(lua,1);
const char* what = luaL_checkstring(lua,2);
switch(what[0])
{
case 'x':
lua_pushnumber(lua,vec3->x);
break;
case 'y':
lua_pushnumber(lua,vec3->y);
break;
case 'z':
lua_pushnumber(lua,vec3->z);
break;
default:
{
printf("__index %s inexistente!!!",what);
printStack(lua,__LINE__);
lua_pushnil(lua);
}
}
return 1;
}
 
static void registerClassVec3(lua_State * lua)
{
luaL_Reg regVec3Methods[] =
{
{       "__gc",         onDestroyVec3Lua},
{       "__index",    onIndexVec3},
{       "__newindex",  onNewIndexVec3},
{       "mul",  onMulVec3},
{       "new",    onNewVec3Lua},
{       NULL,           NULL}
};
luaL_newmetatable(lua, "_luaVEC3");
luaL_setfuncs(lua, regVec3Methods,0);
 
lua_pushvalue(lua, -1);
lua_setfield(lua, -2, "__self");
 
lua_setglobal(lua, "vec3");
 
}
 
int main()
{
lua_State * lua = luaL_newstate();
luaL_openlibs(lua);
registerClassVec3(lua);
 
printf("Executando script teste.lua (C++)\n");
int erred = luaL_dofile(lua, "teste.lua");
if (erred)
printf("Lua error: %s\n",luaL_checkstring(lua, -1));
printf("Fim ...(C++)\n");
lua_close(lua);
return 0;
}
 
 
Então pessoas...
 
Já tentei de varias formas mas não consegui que a meta-table funcione acessando as propriedades e seus métodos.
Se alguém puder indicar o caminho eu agradeço
 


att,

Michel Braz de Morais
Analista / Desenvolvedor de sistemas

 

--
Lua BR - http://groups.google.com/group/lua-br
---
Você está recebendo esta mensagem porque se inscreveu no grupo "Lua BR" dos Grupos do Google.
Para cancelar a inscrição neste grupo e parar de receber seus e-mails, envie um e-mail para [hidden email].
Para obter mais opções, acesse https://groups.google.com/groups/opt_out.

--
Lua BR - http://groups.google.com/group/lua-br
---
Você está recebendo esta mensagem porque se inscreveu no grupo "Lua BR" dos Grupos do Google.
Para cancelar a inscrição neste grupo e parar de receber seus e-mails, envie um e-mail para [hidden email].
Para obter mais opções, acesse https://groups.google.com/groups/opt_out.


--
Lua BR - http://groups.google.com/group/lua-br
---
Você está recebendo esta mensagem porque se inscreveu no grupo "Lua BR" dos Grupos do Google.
Para cancelar a inscrição neste grupo e parar de receber seus e-mails, envie um e-mail para [hidden email].
Para obter mais opções, acesse https://groups.google.com/groups/opt_out.

--
Lua BR - http://groups.google.com/group/lua-br
---
Você está recebendo esta mensagem porque se inscreveu no grupo "Lua BR" dos Grupos do Google.
Para cancelar a inscrição neste grupo e parar de receber seus e-mails, envie um e-mail para [hidden email].
Para obter mais opções, acesse https://groups.google.com/groups/opt_out.

--
Lua BR - http://groups.google.com/group/lua-br
---
Você está recebendo esta mensagem porque se inscreveu no grupo "Lua BR" dos Grupos do Google.
Para cancelar a inscrição neste grupo e parar de receber seus e-mails, envie um e-mail para [hidden email].
Para obter mais opções, acesse https://groups.google.com/groups/opt_out.