[erlang-questions] Luerl - Lua in Erlang: Interface Definition

Henning Diedrich hd2010@REDACTED
Tue Feb 21 04:22:39 CET 2012


Hi Robert,

To allow for String|Chunk, the chunks returned from ps/1 would have to 
be wrapped to be distinguishable from the Strings. I think 'functiondef' 
could be the right choice.

For the names, I'd propose to maybe stay closer to the Lua language 
function names and its C interface [1].

But at any rate, to maybe decide for one of "do" and "eval" to 1) return 
bare results 2) return {Result, State}. Rather than making this 
dependent on whether State was handed in or not as a parameter?

Since Lua uses dofile() both in the Lua language and the C interface, 
(and since of course neither case returns state), the "do" functions 
look earmarked for returning the simple, bare bones Result. However ... 
somehow "eval" is a better fit for a function that is expected to return 
something.

Lua's C interface uses "load" for parsing-only: load, loadfile, lua_load 
[2], lua_loadfile, lua_loadstring, lua_loadbuffer.

This could be an alternative to wrapping the chunks: for load, in Lua 
/"the string mode controls whether the chunk can be text or binary (that 
is, a precompiled chunk). It may be the string "b" (only binary chunks), 
"t" (only text chunks), or "bt" (both binary and text). The default is 
"bt". /[5]

The type that the loads return is 'function': /"If there are no 
syntactic errors, returns the compiled chunk as a function; otherwise, 
returns nil plus the error message." --- /therefore, the right chunk 
wrapper could be { functiondef, ... }, instead of compiled chunks being 
lists as outermost type.

Execution of pre-parsed/compiled chunks is "call": pcall, xpcall, 
lua_call, lua_pcall [3],  and lua_pcallk.

State is created and destroyed by lua_newstate and lua_close.

There is no "eval" in Lua.

So here's my proposal:

luerl:eval(String|Chunk[, State]) -> Result.
luerl:evalfile(PathString[, State]) -> Result.

luerl:do(String|Chunk[, State]) -> {Result, NewState}.
luerl:dofile(PathString[, State]) -> {Result, NewState}.

luerl:newstate() -> State.
luerl:close(State) -> ok.

luerl:load(String) -> {ok, Chunk}.
luerl:loadfile(PathString) -> {ok, Chunk}.
luerl:call(Chunk[, State][, ErlParamList()]) -> {Result, NewState}.

luerl:tolua(list()) -> LuerlTermsList().
luerl:toerlang(LuerlTermsList()) -> list().

This would be somewhat in keeping with Lua's naming.

I am unclear about error state returns. Simply in the Result I guess?

Relative to your proposal that is:
luerl:eval(String|Chunk) -> Result. => luerl:eval(String|Chunk[, State]) 
-> Result.
luerl:dofile(String) -> Result. => luerl:dofile(PathString[, State]) -> 
{Result,State}.
luerl:new() -> State. (currently luerl:init() -> State.) 
=>luerl:newstate() -> State.
luerl:eval(String|Chunk, State) -> {Result,NewState}. => 
luerl:eval(String|Chunk, State) -> {Result,NewState}.
luerl:dofile(String, State) -> {Result,NewState}. => same
luerl:compile(String) -> {ok,Chunk}. => luerl:load(String) -> {ok,Chunk}.

Beyond that, I had thought with 'interface' you would be addressing the 
direct interchange of values between Erlang and Lua. I'd be all for 
making the collection of tables in the Lua state accessible and 
writable, directly, somehow navigating into it using a key structure. 
And if possible, vice versa: giving Lua direct access to Erlang state.

Best,
Henning


[1] http://www.lua.org/manual/5.2/manual.html#4.8

[2] /One note I like, in the description of the C function lua_load : 
"The source argument gives a name to the chunk, which is used for error 
messages and in debug information (see §4.9)." 
/http://www.lua.org/manual/5.2/manual.html#lua_load - 
http://www.lua.org/manual/5.2/manual.html#2.3

[3] /When you use xpcall or lua_pcall, you may give a message handler to 
be called in case of errors. This function is called with the original 
error message and returns a new error message. It is called before the 
error unwinds the stack, so that it can gather more information about 
the error, for instance by inspecting the stack and creating a stack 
traceback. This message handler is still protected by the protected 
call; so, an error inside the message handler will call the message 
handler again. If this loop goes on, Lua breaks it and returns an 
appropriate message./ -
http://www.lua.org/manual/5.2/manual.html#2.3

[4] In Lua (not the C interface), dofile does not run in protected mode. 
http://www.lua.org/manual/5.2/manual.html#6.1

[5] http://www.lua.org/manual/5.2/manual.html#6.1



On 2/20/12 10:59 PM, Robert Virding wrote:
> [snip] I had planned something along the lines of:
>
> luerl:eval(String|Chunk) -> Result.
> luerl:dofile(String) -> Result.
>
> Basic simple interface which initialises a state and evaluates the 
> chunk String in it returning a list of return values (if any). For 
> example luer:eval("local t={'a','b'} return t[1],t[2]") will return 
> [<<"a">>,<<"b">>]. luerl:dofile/1 is not really necessary.
>
> luerl:new() -> State.
> luerl:eval(String|Chunk, State) -> {Result,NewState}.
> luerl:dofile(String, State) -> {Result,NewState}.
> luerl:compile(String) -> {ok,Chunk}.
>
> A more complex interface. luerl:new/0 creates an initial state. 
> luerl:eval/2 will evaluate a chunk in a state and return the values 
> and the updated state. This state can be reused to evaluate new 
> chunks. Again luerl:dofile/2 is not really necessary. 
> luerl:compile(String) compiles the string into an internal form ready 
> to run in eval/1/2.
>
> Result is always a list of return values which may be empty if the 
> chunk does not do a return with values. For data types:
>
> Lua strings are binaries
> Lua numbers are floats
> Lua tables are orddicts (property lists) of key-value tuples
> Lua true, false, nil are just the atoms true, false, nil
>
> Anyway something along those lines. It might be nice to have a 
> function call wrapper which would allow you a more erlang like way of 
> calling a luerl function.
>
> Robert
>
> ------------------------------------------------------------------------
>
>     Regarding interface function names:
>
>     I wonder what logic Luerl's names of do and eval follow:
>
>     dofile/1, like eval/1, returns a pragmatic Ret
>
>     while do/2 returns {String, State}
>
>     Since you are exporting ps/1, there should maybe be a dochunk/2?
>
>     And /1, too?
>
>     Or should it maybe be evalchunk/1, dochunk/2 (the /2s with State
>     as second parameter)?
>
>     Here are some relevant functions from Lua's C interface.
>
>         *luaL_dofile*
>
>         [-0, +?, m]
>         int luaL_dofile (lua_State *L, const char *filename);
>         Loads and runs the given file. It is defined as the following
>         macro:
>
>              (luaL_loadfile(L, filename) || lua_pcall(L, 0,
>         LUA_MULTRET, 0))
>         It returns false if there are no errors or true in case of errors.
>
>         *luaL_dostring*
>
>         [-0, +?, –]
>         int luaL_dostring (lua_State *L, const char *str);
>         Loads and runs the given string. It is defined as the
>         following macro:
>
>              (luaL_loadstring(L, str) || lua_pcall(L, 0, LUA_MULTRET, 0))
>         It returns false if there are no errors or true in case of errors.
>
>         *luaL_loadstring*
>
>         [-0, +1, –]
>         int luaL_loadstring (lua_State *L, const char *s);
>         Loads a string as a Lua chunk. This function uses lua_load to
>         load the chunk in the zero-terminated string s.
>
>         This function returns the same results as lua_load.
>
>         Also as lua_load, this function only loads the chunk; it does
>         not run it.
>
>         *luaL_newstate*
>
>         [-0, +0, –]
>         lua_State *luaL_newstate (void);
>         Creates a new Lua state. It calls lua_newstate with an
>         allocator based on the standard C realloc function and then
>         sets a panic function (see §4.6) that prints an error message
>         to the standard error output in case of fatal errors.
>
>         Returns the new state, or NULL if there is a memory allocation
>         error.
>
>
>     Source: http://www.lua.org/manual/5.2/manual.html
>
>

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://erlang.org/pipermail/erlang-questions/attachments/20120221/46375e29/attachment.htm>


More information about the erlang-questions mailing list