[Date Prev][Date Next][Thread Prev][Thread Next]
[Date Index]
[Thread Index]
- Subject: Re: Empty? No. Array? No. Has? Yes.
- From: Philipp Janda <siffiejoe@...>
- Date: Wed, 03 Jul 2013 21:32:56 +0200
Am 03.07.2013 20:56 schröbte Andrew Starks:
On Wednesday, July 3, 2013, Philipp Janda wrote:
Perhaps we could make every table access a vararg expression of zero or
one value (with the usual argument adjustments) ...
So:
select( '#', baz, baz, baz ) --> 2
Here you are saying that # adjusts so that the last position can be read
and if the variable isn't defined then don't include it. This is how print
and other functions work, presently. Correct?
Every expression in a list of expressions is adjusted to one value,
except the last one.
function empty() end
function multi() return 1, 2, 3 end
select( '#', empty(), empty(), empty() )
is 2 because all return value lists of empty() are adjusted to one nil
except the last call to empty()
Similarly:
select( '#', multi(), multi(), multi() )
is 5 because it is equivalent to
select( '#', 1, 1, 1, 2, 3 )
This makes assignments (or argument passing, or table construction) more
predictable:
local a, b, c = empty(), multi(), 3
c is 3, no matter what empty() or multi() return. IMHO this would be
even more important if table access become vararg expression lists:
local a, b, c = t[ 1 ], t[ 2 ], t[ 3 ]
c should be equal to t[ 3 ] even if t[ 1 ] and t[ 2 ] do not exist.
select( '#', baz, baz, baz, foo ) --> 4
{ 1, baz, 2, baz } --> { 1, nil, 2 }
In the case of table access, I'd suggest that "nil" would be the default
return for all values, but that you could still call an exists-like
function on any index value.
select(1,({1,baz,2,nil})[2]) --> 0
select(1,({1,baz,2,nil})[4]) --> 1
So this would be an exception to the usual argument adjustment: If
inside a table constructor, do not adjust an empty list to a single nil,
only increment the index.
I'm not sure this is worth it.
local x, y = baz, 3 --> x = nil, y = 3
t = { a = nil }
select( '#', t.a ) --> 1
select( '#', t.b ) --> 0
print(exists(a()))
--false --currently true
This already prints `false`. The list of return values can hold nothing,
or one or more values.
Not on my copy of Lua.
print(exists(b()))
--false --currently true
Same here, already prints `false`.
Again, not for me. What version are you using?
I'm sorry, I'm using:
function exists( ... )
return select('#', ... ) ~= 0
end
which is why I didn't catch the precedence bug in your version (as Matt
did else-thread).