Pergunta

Eu vou voltar para o básico aqui, mas em Lua, você pode definir uma tabela assim:

myTable = {}
myTable [1] = 12

Imprimir a referência de tabela em si traz de volta um ponteiro para ele. Para acessar seus elementos você precisa especificar um índice (ou seja, exatamente como se fosse um array)

print(myTable )    --prints pointer
print(myTable[1])  --prints 12

funções agora são uma história diferente. Você pode definir e imprimir uma função assim:

myFunc = function() local x = 14 end     --Defined function
print(myFunc)                            --Printed pointer to function

Existe uma maneira de acessar o corpo de uma função definida. Estou tentando montar um pequeno visualizador de código e gostaria de 'semente' uma determinada função com funções especiais / variáveis ??para permitir um visualizador para 'gancho'-se no código, eu teria de ser capaz de redefinir a função tanto de uma variável ou uma string.

Foi útil?

Solução

Não há nenhuma maneira de obter acesso ao código fonte do corpo da função dada na Lua simples. O código-fonte é jogado fora após a compilação de byte-code.

Nota BTW essa função pode ser definida em tempo de execução com loadstring-like facilidade.

soluções parciais são possíveis - dependendo do que você realmente deseja alcançar

.

Você pode obter posição do código fonte a partir da biblioteca de depuração - se biblioteca de depuração está habilitado e símbolos de depuração não são removidos do bytecode. Depois disso, você pode carregar o arquivo de fonte real e código de extrato de lá.

Você pode decorar funções você estiver interessado em manualmente com metadados necessários. Note que funções em Lua são chaves de tabela válidos, então você pode criar uma tabela função-a-metadados. Você gostaria de fazer esta tabela fraco-introduzidos, por isso não impediria funções sejam recolhidas por GC.

Se você precisa de uma solução de análise de código Lua, dê uma olhada Metalua .

Outras dicas

Usando a biblioteca de depuração é a sua única aposta. Usando isso, você pode obter tanto o string (se a função é definida em um pedaço que foi carregado com 'loadstring') ou o nome do arquivo no qual a função foi definida; em conjunto com a linha-números em que a definição de função começa e termina. Veja a documentação .

Aqui no meu trabalho atual temos remendado Lua para que ele dá-lhe ainda os números das colunas para o início eo fim da função, assim você pode obter a fonte função usando isso. O patch não é muito difícil de reproduzir, mas eu não acho que vou ser autorizado a publicá-la aqui: - (

Confira Lua introspectivo Instalações na biblioteca de depuração.

A principal função introspectiva na biblioteca de depuração é o debug.getinfo função. Seu primeiro parâmetro pode ser um função ou um nível de pilha. Quando você debug.getinfo chamada (foo) para alguns função foo, você tem uma tabela com alguns dados sobre essa função. o mesa pode ter os seguintes campos:

O campo que deseja é func eu acho.

Você pode fazer isso através da criação de um ambiente para cada função (veja setfenv ) e usando (contra local) variáveis ??globais . Variáveis ??criadas na função, então, aparecem na tabela de ambiente após a função é executada.

env = {}
myFunc = function() x = 14 end
setfenv(myFunc, env)
myFunc()
print(myFunc)    -- prints pointer
print(env.x)     -- prints 14

Como alternativa, você pode fazer uso do Debug Biblioteca:

> myFunc = function() local x = 14 ; debug.debug() end
> myFunc()
> lua_debug> _, x = debug.getlocal(3, 1)
> lua_debug> print(x) -- prints 14

Ele provavelmente seria mais útil para você para recuperar as variáveis ??locais com um função de gancho em vez do modo de depuração entrar explicitamente (ou seja, adicionando a chamada debug.debug ())

Há também um Debug Interface na API Lua C .

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top