lua-users home
lua-l archive

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


Sorry, I guess I should have been clearer about that. This was a thread from some months ago.

A tuple is (for me in this context) an immutable list of objects. Functional tuples are a representation of tuples as functions; the function returns the tuple'd objects as a multiple return.

A simple pure-lua implementation: (leaving out the "select" feature)

> function tuple(...) return function() return unpack(arg) end end
> foo = tuple(2, 3, 4)
> =foo()
2       3       4

But one can do it *much* more efficiently in C: the following tiny patch
is a very simple implementation, but arguably lacks sufficient error-checking.
Implementing tail (or select, but I think tail is better) means actually
writing the tuple function instead of using lua_pushupvalues but it's only
a couple more lines of code.

The end result is a tuple represented as a simple lua_CFunction with a vector
of objects (but limited in size because nupvalues is a byte).

Some less simple implementations are in the mailing list archives.

R.

-------PATCH-----------
diff -r -u lua-5.0.2/src/lib/lbaselib.c lua-5.0.2-simpletuple/src/lib/lbaselib.c
--- lua-5.0.2/src/lib/lbaselib.c	2004-03-03 19:45:13.000000000 -0500
+++ lua-5.0.2-simpletuple/src/lib/lbaselib.c 2004-05-10 10:34:32.000000000 -0500
@@ -504,6 +504,11 @@

 /* }====================================================== */

+static int l_tuple (lua_State *L) {
+  lua_pushcclosure(L, lua_pushupvalues, lua_gettop(L));
+  return 1;
+}
+

 static const luaL_reg base_funcs[] = {
   {"error", luaB_error},
@@ -531,6 +536,7 @@
   {"dofile", luaB_dofile},
   {"loadstring", luaB_loadstring},
   {"require", luaB_require},
+  {"tuple", l_tuple},
   {NULL, NULL}
 };