And, in particular, Lua is expressly designed to be embedded in C. By design, in order for it to be useful, you're expected to define your own functions in native code and make them accessible through Lua.
Given that, no matter what, you're going to be stuck context switching, since C is zero-based. I wish Lua had picked 0-based indexing not because it's better, but because it's consistent with the host language Lua is designed to be embedded in.
Fun fact about this: Lua is embedded in MediaWiki (the software that runs Wikipedia and also a lot of other wikis). And in MediaWiki template variables are also 1-indexed (no comment on this particular design choice). So the 1-based indexing of Lua becomes an utterly fantastic feature not just because it's convenient but also because a lot of people writing code are super new to programming, and any barrier to entry (like having to shift your indices when you go from the template to the module you're invoking) would potentially stop someone from writing any code at all in the first place.
So for this one use case at least, the 1-based indexing is pretty nice.
Wasn't Lua created by a professor? People in academia tend to develop projects aimed at people with no real world experience, and have often these weird design choices that do not map well in the real world with real code.
OT: which is why I think really great stuff like Racket (maybe even Haskell) have a hard time breaking through. The intended audience is people that have never seen a programming language, not tired engineers with deadlines.
There’s a history of Lua somewhere on the website. It wasn’t created as an academic exercise, but as a configuration language for the Brazilian national petrol company. It grew into a full scripting language.
Given that, no matter what, you're going to be stuck context switching, since C is zero-based. I wish Lua had picked 0-based indexing not because it's better, but because it's consistent with the host language Lua is designed to be embedded in.