lua-users home
lua-l archive

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


2015-08-31 6:36 GMT+02:00 Daurnimator <quae@daurnimator.com>:

> I was playing around creating different things using this style, and
> discovered a real need for a 'settop' like function from lua.
> That is, a function that removes trailing vararg values.

It's in the not very popular [1] xtable [2] module.

~~~
xtable.tuple.keep(count,...)

   Returns `count` arguments, starting at the first extra argument. As in
   the case of select, a negative number indexes from the end (-1 is the
   last argument).
~~~

> static int settop(lua_State *L) {
>         int n = luaL_checkinteger(L, 1);
>         luaL_argcheck(L, n >= 0, 1, NULL);
>         luaL_checkstack(L, n+1, NULL);
>         lua_settop(L, n+1);
>         return n;
> }

The xtable implementation is:

/* tuple.keep(count,...) */
static int tuple_keep(lua_State *L) {
  int count=lua_absindex(L,luaL_checkint(L,1));
  lua_settop(L,count+1);
  return count;
}

The main differences are that my implementation does not
allow 'count' to be greater than select('#',...) and yours does
not respect a negative count. I.e., 'keep' emphasizes kinship
to 'select' and 'settop' emphasizes kinship to `lua_settop`.

> It wouldn't be a bad addition to the lua base library.

While we are at it, why not burn the candle at both ends?

extract(from,to,...)

   Returns arguments `from` to `to`, providing explicit nils when
   `...` is too short. As in the case of select, a negative number
   indexes from the end (-1 is the last argument).

[1] Last on the shortlist with 6 stars.
[2] https://github.com/dlaurie/xtable