Sign in to follow this  
janta

[LUA] create a function, then assign it to a variable

Recommended Posts

Hi
I am a Lua beginner, and I have a problem.
I want to let my users (designers) create some Lua functions, but I want to keep track of the function they create

So for example, I dont want them to give me this:

[CODE]"function SayHello() print('hello') end"[/CODE]

I want them to give me these
- name: [CODE]SayHello[/CODE]
- body: [CODE]function () print('hello') end[/CODE]

And do along the lines like

luaL_loadstring(body);
lua_setglobal(L, name);

But this won't work because the function's body does not compile on its own.

Is there another way for me to do that, besides manually formatting the script like

[CODE]sprintf(buffer, "%s =%s", name, body)[/CODE]

Thank you for your help

Share this post


Link to post
Share on other sites
[code]SayHello = function() print('hello') end[/code]

But this is more or less semantically identical to:

[code]function SayHello() print('hello') end[/code]

It might be worth getting to know Lua a bit better before deciding on just how you're going to expose a scripting interface, as you might miss a few tricks... Edited by e?dd

Share this post


Link to post
Share on other sites
I did know that, I think I just didn't explain myself well.

Anyway I found this: [url="http://stackoverflow.com/questions/4823791/how-can-i-load-an-unnamed-function-in-lua?rq=1"]http://stackoverflow...ion-in-lua?rq=1[/url]
And the poster had about the same question as me.

It turns out that returning the function chunk does the trick.

My data therefore is like this[list]
[*]body = "return function (msg) print(msg) end"
[*]name = "print_message"
[/list]
And my (pseudocode) is like this

[CODE]
void CreateFunc(char* name, char* body)
{
// verify if the function already exists
assert(!funcs.contains(name));

luaL_loadstring(L, body);
lua_pcall( L, 0, 1, 0 );
lua_setglobal(L, name);

funcs.insert(name)
}
[/CODE]

I'm open to other suggestion or remarks of course

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

Sign in to follow this