  lua-l archive

• Subject: Re: Lua 5.2 sequence definition - clarification needed
• From: Lorenzo Donati <lorenzodonatibz@...>
• Date: Thu, 30 Jun 2011 06:29:45 +0200

```On 30/06/2011 1.03, Sam Roberts wrote:
```
```On Wed, Jun 29, 2011 at 12:25 AM, Lorenzo Donati
<lorenzodonatibz@interfree.it>  wrote:
```
```* 1st point

Section 3.4.6 of Lua 5.2 refman says:

"Unless a __len metamethod is given, the length of a table t is only defined
if the table is a sequence, that is, the set of its positive numeric keys is
equal to {1..n} for some integer n."
```
```
...

```
```"Note, however, that non-numeric keys *or non-positive numeric keys* do not interfere with whether a table is a sequence."
```
```
Wouldn't you also want to list keys of zero and positive integer keys>  n+1?

Its just a note, it doesn't have to be an exhaustive description of
the complement of the set of positive integers from {1...n}.

```
```
```
The note is relevant, not just nitpicking, because there is an important use case: the standalone interpreter.
```
```
Negative integer keys are used to store the command line arguments before the script name. Moreover arg is the script name, which is always there. So someone could be mistaken thinking that "arg" is not a sequence, which is not true.
```

```
```...

```
```Therefore I would modify slightly the definition:

"Unless a __len metamethod is given, the length of a table t is only defined
if the table is a sequence, that is, the set of its positive numeric keys is
equal to {1..n} for some *non-negative* integer n."

This would rule out that (admittedly unintuitive, but correct)
misinterpretation.
```
```
In the set of positive keys {1..n}, how could it be correct to think n
is not positive?
```
```
```
Well, the reference manual is supposed to be formally correct (At least to some degree). There is no mention that {} (empty table) is a sequence (it is the "empty sequence" with length 0), so one has to infer that the notation {1..n} could indeed also refer to this case, and in this case n==0.
```
```
So it is perfectly clear that that notation also comprises the case {1..0} (meaning the empty set).
```
```
But (and this is a bit of nitpicking, I already said in my original post) if one has done that inference, could rightfully think that also {1..-4} means the empty set, so n==-4, and so the length may be -4.
```
```
It is an unintuitive inference, but perfectly logical, given that the notation {1..n} is not defined anywhere.
```
```
Moreover, this doubt may be reinforced by the past history of Lua. In Lua 5.1 #t returned an apparently "random" integer whenever t had holes. The manual stated very clearly the possible return values, but it was a rather convoluted explanation for people with little advanced math background.
```
```
```
And saying n is non-negative isn't the same as saying n is positive. 0
is non-negative and non-positive.
```
```
```
Yes, and since #{} == 0 (and that's not an implementation detail, as far as I can tell), you should say that the length of a table may be 0. The current wording doesn't mention that.
```
```
An alternative to my initial proposal may be to add an explicit reference to the empty sequence:
```
```
"Unless a __len metamethod is given, the length of a table t is only defined if the table is a sequence, that is, the set of its positive numeric keys is *either* equal to {1..n} for some integer n *or to the empty set*. In *the first* case, n is its length, *in the second the length is 0*."
```
Of course you may find a still better wording.

```
```
Cheers,
Sam

```
```

```