In many aspects, Lua is more verbose and awkward than other similar languages. Compare

  local alive_enemies = {}
  for _, enemy in ipairs(enemies) do
    if not enemy.dead then
      table.insert(alive_enemies, enemy)
    end
  end
  enemies = alive_enemies
with

  enemies = enemies.filter(enemy => enemy.alive)

It's more minimalistic, that's true. But there's nothing stopping you writing or downloading an array library so you can do this:

  enemies = array.filter(enemies, function(e) return e.alive end)
Or even setting a metatable so you can do:

  enemies = enemies.filter(function(e) return e.alive end)

Due to the embedded nature of Lua, it’s often impossible or difficult to use libraries. And I don’t want to reimplement basic functionality every time I start a new project.

That seems like a contextual problem, not a Lua problem.

If you're in Love and/or control the environment you're free to bring in whatever libraries you want. Or to build your wrapper to support multiple files from the user.

Like you could suffer from a bad embedded scripting setup with any language. Granted if it was embedded Python or Javascript you would get a bit more for builtin if they embed a full implementation. But also embedding Lua with support for user supplied libraries is less effort than embedding a whole Python/JS runtime

> Due to the embedded nature of Lua, it’s often impossible or difficult to use libraries.

Last time I used LÖVE that wasn't the case, nor does it seem to be the case today, you can require libraries or even use LuaRocks if that is what you prefer, and everything just works.

well, it is true that the second one is more concise.

The only difference is that one of the language is embedded and barely takes any place. it's just a few C files :-D It offers just enough functionality while not making it overly complicated to make basic things.

The other one is way way bigger. and even Array.filter didn't exist from the start

Alright, here is Janet, which is designed to be embeddable just like Lua:

  (set enemies (filter |($ :alive) enemies))
Though JavaScript has QuickJS, which is also lightweight.