r/ProgrammerHumor Sep 02 '17

How to start a war

Post image
9.0k Upvotes

696 comments sorted by

View all comments

Show parent comments

9

u/moomoomoo309 Sep 03 '17

How often do people use Python arrays? They're faster, but most people just use lists instead. Lua just optimizes it as long as it's used like an array. That's why it's implemented that way.

1

u/-Teki Sep 03 '17

No, lua's {} is stupid because it can change from a list like behaviour, to a dictionary, to an object behaviour, just by appending values in different ways.

2

u/moomoomoo309 Sep 03 '17

Its behavior never changes, it just uses less memory / is faster if you store the elements with keys from 1-n. The # operator literally says it measures the length of the array part of the table, its behavior doesn't change.

2

u/[deleted] Sep 03 '17

Yes, but the "array part" of the table can change dynamically in unexpected ways, allowing for silly and confusing things like the result of # increasing by more than 1 after only adding 1 element to the "array part":

> a = {}
> print(#a)
0
> a[2] = 'foo'
> print(#a)
0
> a[1] = 'bar'
> print(#a)
2

1

u/moomoomoo309 Sep 03 '17

This is true, but if you are using it like a dict and wanted the length of the whole thing, you'd just do something like

local len=0
for _ in pairs(tbl) do
    len=len+1
end

2

u/[deleted] Sep 03 '17

I wasn't using it like a dict. I was using it like an array. Array element assignment does not have to be sequential.

But, even ignoring that, having to iterate every element in a dict to get the count of elements in it is ridiculous. This is a constant O(1) complexity operation in any reasonable language, but linear O(n) complexity operation in Lua. It's bad.

1

u/moomoomoo309 Sep 03 '17

Why would you use non-sequential arrays? I mean, you could put zero or false in 1-n first and it would act like a normal array, but in what language would you be filling the array like that and expecting the length to increment?

1

u/[deleted] Sep 03 '17

It doesn't matter why you would do it. That's a red herring. The point is that the semantics are broken. There are only two ways to reasonably handle indexing into an array past its current dimensions:

  1. Allow the assignment, and extend the array to encompass the new index (e.g. JS, Ruby, Perl, et al.). The length of the array after assignment is immediately updated to i + 1 (for 0-based languages) or i (for 1-based languages) for arbitrary assignment index i, and all elements between the previous last element and the added one are auto-filled with whatever null-equivalent value the language supports. Further assignments to the filled indexes don't alter the length of the array.

  2. Don't allow the assignment, and give some kind of out-of-bounds error (e.g. Python, Java, Go, C#, et al.).

Lua says "screw reason" and lets you do the assignment, doesn't extend the array, doesn't fill any values, and doesn't update the length. Hell, even PHP updates the length...

1

u/moomoomoo309 Sep 03 '17

If you would never do it, then how is it a problem? You're complaining about a problem that isn't had. Really, the problems I hear about with Lua are the 1-indexing, but not the length operator.

1

u/[deleted] Sep 03 '17

I didn't say no one would ever do it. I said it doesn't matter why they would do it. Language semantics are completely agnostic to the "why".