lua-users home
lua-l archive

[Date Prev][Date Next][Thread Prev][Thread Next] [Date Index] [Thread Index]

On 9/6/07, Roberto Ierusalimschy <> wrote:
> > I'm curious about a problem I encountered with this:
> >
> > table.sort(sometable, function(a, b) return a[1] < b[1] end);
> >
> > If this is executed repeatedly this creates a new closure every time.
> > Because, as I understand it, this function is compiled as a prototype
> > with no upvalues, why is a new closure created every time? Seems
> > unnecessary, let alone inefficient. Would it not be possible for the
> > lua compiler to just get the reference to the function (closure) and
> > pass it?
> Unfortunately not :(  The compiler has no way to know whether the
> closure is "escaping" through 'table.sort' (e.g., being stored in
> global variables), and each new closure may have its own independent
> environment.
To clarify... someone could do a setfenv on the function causing its
environment to be different, even though there's no upvalues.  Even if
the function/closure itself doesn't touch the environment, it can
still be used by external functions.  Perhaps a method to mark a
function as being 'locked' and disable changing its environment or
using upvalues could be an option...  However that is probably much
more work than its worth...

Thomas Harning Jr.