[Date Prev][Date Next][Thread Prev][Thread Next]
[Date Index]
[Thread Index]
- Subject: Re: Possible language extension: colon-notation in an expression as shorthand for instance-specific method
- From: Sam Roberts <vieuxtech@...>
- Date: Mon, 26 Jan 2009 13:28:36 -0800
On Mon, Jan 26, 2009 at 12:17 PM, Mark Tomczak <mtomczak@wildpockets.com> wrote:
> Greetings all!
> We're considering a modification to the version of Lua embedded in our game
> engine that would allow for this construct (which is currently a syntax
> error in Lua):
> CallbackManager.postMyCallback(myInstance:instanceMethod)
For what its worth, I wasn't able to guess what this would do, knowing
vanilla lua, so I don't think its a very obvious extension.
Obviousness to a lua developer doesn't necessarily matter if your
users knew nothing of Lua before meeting your game, though.
> Under the present language rules, myInstance:instanceMethod is an error (as
> I understand it) because the colon notation is only valid in the context of
> function calls and function declarations, but is not valid in the context of
> specifying a function value. Currently, we can accomplish this goal by
> instead making the statement "CallbackManager.postMyCallback(function ()
> myInstance:instanceMethod() end)", but that seems to be a great deal more
> typing than should be necessary.
You could also do:
CallbackManager.postMyCallback(myInstance.instanceMethod, myInstance)
Which is only a bit more typing, and follows the common pattern of
assert() and pcall().
Or you could add a helper function:
CallbackManager.postMyCallback(bind(myInstance, "instanceMethod"))
Where:
function bind(instance, method)
return function () return (instance[method])(instance) end
end
And you can rename bind to something shorter, "B"?, if you are really
into saving characters.
Or, you can handle it at the other end:
CallbackManager.postMyMethod(myinstance, "instanceMethod")
Which is longer than your syntax extension by only two characters:
CallbackManager.postMyCallback(myInstance:instanceMethod)
Cheers,
Sam