我正在开发一个用于序列化/反序列化的系统,我正在尝试使用函数来获得一些非常奇特的东西.我的目标是以人类可读和可逆的方式序列化包含函数的对象(序列化文件需要在loadfile()步骤之后进行处理).我需要一种方法来获取函数的实际来源,看起来我不能总是用debug.getinfo()来做.
我知道debug.getinfo()将给出定义它的文件和行(或函数的来源,具体取决于它的来源).有没有办法可以从该文件中读取函数文本?我愿意使用某种解析器实用程序来实现这一点.也许有用于解析Lua代码的Lua包?
也许有一种方法可以让loadfile()或require()在某处自动保留函数源?
是的,我知道你可以从debug.getinfo中获取各种信息,但它无法处理通过stdin加载的函数...
uberblah@glade-m:~$ lua Lua 5.1.5 Copyright (C) 1994-2012 Lua.org, PUC-Rio > a = function() print("hello, world!") end > require("serpent") > s = require("serpent") > =s.block(debug.getinfo(a)) { currentline = -1, func = loadstring("LuaQ\000\000\000\000\000\000\000\000\000=stdin\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000A@\000\000@\000\000?\000\000\000\000\000\000\000\000\000\000\000print\000\000\000\000\000\000\000\000hello, world!\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000",'@serialized') --[[function: 0x2068a30]], lastlinedefined = 1, linedefined = 1, namewhat = "", nups = 0, short_src = "stdin", source = "=stdin", what = "Lua" } --[[table: 0x206cf80]] > f = io.open("stdin", "r") > =f nil
来自STDIN的源解决方案... 1)捕获所有STDIN,将其写入文件2)从该文件加载信息,而不是从stdin加载3)debug将跟踪该文件中的函数行号
使用debug.getinfo
你可以得到source
,linedefined
和lastlinedefined
.除非您格式化您的代码,否则您应该能够从此信息中提取函数的完整代码.无需解析代码,只需获取正确的行集.