2013-06-25 2 views
5

Как я могу перечислить все функции, включенные в исходный файл Lua?Список функций Lua в файле

К примеру, у меня есть fn.lua, который содержит

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

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

И я хочу, чтобы иметь возможность отображать эти имена функций (test1, test2) из ​​другого сценария Lua.

Единственный способ, которым я могу сейчас нарисовать, это включить файл с использованием require, а затем перечислить функции в _G - но это также будет включать все стандартные функции Lua.

Конечно, я мог бы просто проанализировать файл вручную, используя функции поиска строк, но для меня это не очень похоже!

Это, в конечном счете, станет частью процесса, который позволяет разработчику записывать функции в Lua, а оператор выбирает, какая из этих функций вызывается из списка в Excel (yuk!).

ответ

6

Если вы поместите их в «модуль» (который вы, вероятно, следует сделать, так или иначе):

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

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

return mymodule 

Это становится тривиальным:

mymodule = require"mymodule" 

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

Если вы абсолютно должны держать их в необработанной форме, вам придется загружать их по-другому, чтобы отделить вашу глобальную среду, а затем перебирать ее аналогичным образом (возможно, по очищенному внутреннему env _G).

+0

я должен был изменить формат входного файла: «MyModule = {} функцию mymodule.test1() печати ("Тест 1") конец функция mymodule.test2() печати («Тест 2») конец return mymodule ' –

+0

ах, извините, я исправлю это. –

+0

Также - (и я не понимаю, почему) имена функций в таблице mymodule являются строками, а не функциями. Но mymodule.test1() отлично работает. –

1

Если вы хотите сделать это, то лучше определить функцию представляет собой пакет, as described in Programming in Lua book:

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

Тогда вы можете просто перебирать таблицу functions.

3

Я вижу три пути:

  1. Сохранить имена в _G перед загрузкой сценария и сравнить с именами, оставленных в _G после загрузки. Я видел код для этого, либо в списке рассылки Lua, либо в вики, но я не могу найти ссылку прямо сейчас.

  2. Сообщить о глобальных признаках, используемых в функции, путем разбора luac списков, как в http://lua-users.org/lists/lua-l/2012-12/msg00397.html.

  3. Используйте мой инспектор байтокода lbci из Lua, который содержит пример, который сообщает глобальные переменные.

+0

Идея с разницей '_G' before и' _G' после действительно хороша, я бы не подумал об этом. –

+0

Я думал об сравнении _G, но надеялся, что есть более простой способ. Мне нравится идея использования luac, поскольку я думал об использовании luac для базовой проверки синтаксиса. –