2013-06-25 9 views
5

Jak mogę wyświetlić listę wszystkich funkcji zawartych w pliku źródłowym Lua?Lista funkcji Lua w pliku

Na przykład, mam fn.lua który zawiera

function test1() 
     print("Test 1") 
end 

function test2() 
     print("Test 2") 
end 

I życzę, aby móc wyświetlać te nazwy funkcji (test1, test2) z innego skryptu Lua.

Jedyny sposób, w jaki mogę w tej chwili stwierdzić, to dołączenie pliku przy użyciu polecenia require, a następnie wyświetlenie funkcji w _G - ale będzie to obejmować również wszystkie standardowe funkcje Lua.

Oczywiście mogłem po prostu parsować plik ręcznie za pomocą funkcji wyszukiwania ciągów, ale to nie wydaje mi się zbyt lua!

To ostatecznie stanie się częścią procesu, który pozwala programistom pisać funkcje w Lua, a operatorowi wybrać, które z tych funkcji są wywoływane z listy w Excelu (yuk!).

Odpowiedz

6

Jeśli umieścić je wszystkie w „module” (co powinieneś zrobić, w każdym razie):

mymodule = { } 
function mymodule.test1() 
    print("Test 1") 
end 

function module.test2() 
    print("Test 2") 
end 

return mymodule 

Staje się trywialne:

mymodule = require"mymodule" 

for fname,obj in pairs(mymodule) do 
    if type(obj) == "function" then 
     print(fname) 
    end 
end 

Jeśli koniecznie trzeba zachować je w w surowej postaci, musielibyście załadować je w inny sposób, aby oddzielić środowisko globalne, a następnie iterować nad nim w podobny sposób (prawdopodobnie po oczyszczonym wewnętrznym env).

+0

musiałem zmienić format pliku wejściowego: „mymodule = {} funkcji mymodule.test1() druku ("Test 1") koniec funkcja mymodule.test2() print ("Test 2") koniec powrót mymodule ' –

+0

ah prawo, przepraszam, naprawię to. –

+0

Również - (i nie rozumiem dlaczego), nazwy funkcji w tabeli mymodule nie są funkcjami łańcuchów. Ale mymodule.test1() działa dobrze. –

1

Jeśli chcesz to zrobić, to lepiej, aby zdefiniować funkcję to pakiet, as described in Programming in Lua book:

functions = {} 
function functions.test1() print('foo') end 
function functions.test2() print('bar') end 
return functions 

Następnie można po prostu iteracyjne tabelę functions.

3

widzę trzy sposoby:

  1. zapisać nazwy w _G przed załadowaniem skryptu i porównać z nazwami pozostawione w _G po załadowaniu go. Widziałem jakiś kod na ten temat, albo na liście dyskusyjnej Lua, albo na wiki, ale nie mogę teraz znaleźć łącza.

  2. Zgłaszanie globaliów użytych w funkcji przez analizowanie wpisów luac, jak w http://lua-users.org/lists/lua-l/2012-12/msg00397.html.

  3. Użyj mojego inspektora kodu bajtowego lbci od wewnątrz Lua, który zawiera przykład raportujący globals.

+0

Pomysł z różnicą "_G" przed i "_G" po jest naprawdę niezły, nie pomyślałbym o tym. –

+0

Myślałem o porównaniu _G, ale miałem nadzieję, że był prostszy sposób. Podoba mi się pomysł użycia luaca, ponieważ myślałem o używaniu luac do sprawdzania składni. –