lua-users home
lua-l archive

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

On 9/6/07, Thomas Harning Jr. <> wrote:
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.

Unless I'm missing the point, wouldn't the simple solution here be just to use a named comparison function, bound earlier - resulting in the creation of only one closure - rather than an anonymous one?