[Date Prev][Date Next][Thread Prev][Thread Next]
[Date Index]
[Thread Index]
- Subject: Re: luaproc thought
- From: David Manura <dm.lua@...>
- Date: Tue, 29 Sep 2009 22:30:42 -0400
On Tue, Sep 29, 2009 at 7:40 PM, Mark Hamburg wrote:
> It would be nice to have a way
> to say essentially "the following portion of the program text should form a
> syntactically valid Lua chunk which should be encoded as a loadable string"....
> We could get around this by passing functions and dumping them to bytecode
> strings....However, we have to be
> careful to ensure that the functions so used do not have any upvalues...
> But imagine a chunk keyword (anathema I know to add a keyword, but imagine
> it none the less). This keyword basically works just like "function" but it
> returns the bytecode for the chunk and does not capture upvalues.
You can check at run-time whether a given function has upvalues via
"debug.getupvalue(f,1) == nil", which is basically bytecode
inspection. Analogously, you can also detect access to globals
(checkglobals [1]). Would that be enough? As with [1], it wouldn't
be that much work to write a tool to also statically verify the
absence of upvalues (e.g. with luac -p -l, Metalua, patched luac,
etc.) provided the given functions are annotated in some way. For
example, in luaanalyze it could be
function()
--! noupvalues() -- this will error at compile time if the
current function has upvalues
msg = luaproc.receive("achannel")
print(msg)
end
or inversely,
--! luacode() -- this will error at compile time if the
subsequent string is not valid Lua
[[ msg = luaproc.receive("achannel")
print(msg) ]]
or more transparently
luacode [[ msg = luaproc.receive("achannel")
print(msg) ]]
where luacode is the identity function at runtime but assumes the
meaning of "--! luacode()" in the lint tool.
That said, there have been occasions where I wanted something like you
suggest, except that the called function wants the original source,
not just the bytecode. Use cases might involve code generation [2],
metaprogramming, debugging, or serializing a data structure back to
disk in original source code form. There have been proposals to allow
the source code for a function to be obtained [3], which would address
this. A more extensive approach is Metalua, which provides you full
access to the AST.
[1] http://lua-users.org/wiki/LuaTypeChecking
[2] http://lua-users.org/wiki/CodeGeneration
[3] http://lua-users.org/lists/lua-l/2008-09/msg00345.html