[Date Prev][Date Next][Thread Prev][Thread Next]
[Date Index]
[Thread Index]
- Subject: Re: Change #..., disallow #{}, add ...[]
- From: Sean Conner <sean@...>
- Date: Mon, 19 Oct 2015 04:58:33 -0400
It was thus said that the Great Dirk Laurie once stated:
> 2015-10-19 0:34 GMT+02:00 Soni L. <fakedme@gmail.com>:
>
> > First of all #{} makes no sense, either you know the size
> > or you should be using select('#') instead.
>
> If you mean no sane Lua programmer should type that precise
> expression, then I agree. If you mean that # acting on any table
> constructor makes no sense, then I disagree. As Humpty Dumpty
> might have said to Alice: what is #{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1}?
>
> > Second it'd be a lot more useful if #... meant the same as
> > select('#', ...).
> > [skip]
> > ...[n] could mean the same as select(n, ...) (but with an opcode
> > instead of a function, so that it's slightly faster).
>
> I agree with the spirit of these suggestions. The length operator
> has the right feel.
>
> `select` is arguably the least elegant function in the standard library.
> There is absolutely no reason why a function call is needed.
> The OP_VARARG instruction at present does not use its `C` field.
> Those nine bits could be exploited to provide the functionality of
> `select`.
>
> However, there is no need for `...` if we are not calling a function.
> The OP_VARARG instruction knows where the vararg is.
>
> The following syntax could be used:
>
> ## -- select('#',...)
> #index -- select(index,...) when n is an integer
>
> All that we would need to sacrifice is the __len metamethod when
> its argument is an integer, since then "Lua knows what to do".
Hmm ...
function foo(...)
local max = select('#',...)
for i = 1 , max do
print(string.format("Stack: %d %d %s",i,i-max-1,tostring(select(i,...))))
end
end
function bar(...)
for i = 1 , ## do
print(string.format("Stack: %d %d %s",i,i-##-1,tostring(#i)))
end
end
-spc (I think I like it)